Apakah ada cara untuk menulis ulang struktur perintah A && B || C | D
sehingga B atau C disalurkan ke D?
Dengan perintah saat ini, hanya B atau C dan D yang dijalankan.
Sebagai contoh:
Ya, di bash Anda dapat menggunakan tanda kurung:
(A && B || C) | D
Dengan cara ini, output dari A && B || C
akan disalurkan ke D
.
A && (B || C) | D
, jika Anda tidak ingin B, C, atau D berjalan ketika A gagalsh
:)A
ada di dalam subkulit, ini juga termasukA
.)Anda dapat menulis ini sebagai
Anda mengatakan ingin menjalankan salah satu
B
atauC
, tetapiA && B || C
tidak mencapai itu. JikaA
berhasil, tetapiB
berjalan dan gagal, itu akan dijalankanC
.Catatan 1: jika Anda entah bagaimana dapat menjamin bahwa
B
selalu berhasil dan ingin tetap dengan versi pendek, maka saya masih akan memilihlebih
( ... )
, karena yang terakhir tidak perlu memaksa subkulit baru untuk dibuat, yang mungkin atau mungkin tidak dioptimalkan.Catatan 2: kedua bentuk menganggap
A
tidak menghasilkan output, yang benar dalam contoh Anda tetapi tidak harus demikian pada umumnya. Itu bisa dihindari dengansumber
{ … }
tidak memaksa subshell dibuat karena pipa? Saya mengamati perilaku berikut:pgrep bash
danpgrep bash | cat
danif true; then pgrep bash; fi
dan{ pgrep bash; }
memiliki satu garis keluaran;( pgrep bash; )
dan( pgrep bash; ) | cat
dan{ pgrep bash; } | cat
danif true; then pgrep bash; fi | cat
memiliki dua jalur output.... | ...
menyebabkan subkulit dibuat, itu tidak dapat dihindari.( ... )
, setidaknya dalam teori, menyebabkan subkulit tambahan dibuat yang{ ...; }
menghindari, tapi itulah yang saya maksud dengan "mungkin atau mungkin tidak dioptimalkan": ada kemungkinan bahwa dalam kasus khusus ini, shell menyadari itu tidak masalah, efeknya akan sama.Jawaban accepter benar tetapi tidak mencakup kasus penggunaan potensial untuk tidak memiliki output
A
sebagai inputD
. Untuk mencapai itu, Anda memerlukan pengalihan aliranA
tergantung pada kebutuhan Anda.Jika Anda ingin membuang output
A
:Jika Anda ingin melihat output
A
pada terminal:Jika Anda membutuhkan output
A
sebagai input dari perintah selanjutnyaE
Anda akan memerlukan grup perintah tambahan dan pengalihan aliran:Jika semua ini terlihat terlalu misterius bagi Anda (seperti halnya bagi saya), saya sarankan Anda menggunakan variabel shell khusus untuk status keluar
A
dan bekerja dengan itu:Jika Anda ingin lebih ringkas tetapi tidak terlalu misterius saya sarankan ini:
(Lihat juga bagian terakhir dari jawaban hvd yang tidak saya perhatikan ketika saya menulis jawaban asli saya.)
sumber
A
dari saluran pipa.