Komut yapısını yeniden yazmak için bir yol var mı A && B || C | D
?
Geçerli komutla ya sadece B ya da hem C hem de D çalıştırılır.
Örneğin:
Komut yapısını yeniden yazmak için bir yol var mı A && B || C | D
?
Geçerli komutla ya sadece B ya da hem C hem de D çalıştırılır.
Örneğin:
Yanıtlar:
Evet, bash'de parantez kullanabilirsiniz:
(A && B || C) | D
Bu şekilde çıktısı A && B || C
boruya geçirilecektir D
.
sh
:)
A
A
Bunu şu şekilde yazabilirsiniz:
if A; then B; else C; fi | D
Sen de koşmak istediğini söylüyorsun ya B
da C
, ama A && B || C
bunu başaramadı. EğerA
, ancak başarılı B
koşular ve başarısız, bu çalıştıracaktır C
.
Not 1: bir şekilde garanti ederseniz B
Her zaman başarılı olduğunu ve kısa bir versiyona sadık kalmak istiyorsanız bir yine de tercih ederim
{ A && B || C; } | D
üzerinde ( ... )
veya uzak optimize almak olmayabilir yeni altkabuk oluşturulacak ikincisi gereksiz yere kuvvetler gibi.
Not 2: Her iki formda da A
örnekte doğru olmayan ancak genel olarak böyle bir çıktı bulunmadığı varsayılır . Bundan kaçınılabilir
A; if [ "$?" -eq 0 ]; then B; else C; fi | D
{ … }
Boru nedeniyle bir alt kabuğun oluşturulmasına zorlamadığından emin misiniz ? Aşağıdaki davranış dikkat edin: pgrep bash
ve pgrep bash | cat
ve if true; then pgrep bash; fi
ve { pgrep bash; }
çıkışın bir satır var; ( pgrep bash; )
ve ( pgrep bash; ) | cat
ve { pgrep bash; } | cat
ve if true; then pgrep bash; fi | cat
iki çıkış hattı var.
... | ...
bir alt kabuğun oluşturulmasına neden olur, bu kaçınılmazdır. ( ... )
, en azından teoride, kaçınan ek bir alt kabuğun yaratılmasına neden olur { ...; }
, ancak "optimize edilebilir veya optimize edilemez" ile kastettiğim budur: bu özel durumda, kabuğun önemli olmadığını fark etmesi mümkündür, etkisi aynı olurdu.
Alıcı yanıtı doğrudur, ancak girişinin çıktısı olmayan potansiyel kullanım durumunu kapsamaz . Bunu başarmak için ihtiyaçlarınıza bağlı olarak bir akış yönlendirmesi yapmanız gerekir.A
D
A
A
Yine de çıktıyı silmek istiyorsanız :
{ A >/dev/null && B || C; } | D
A
Terminaldeki çıkışını görmek istiyorsanız :
{ A >/dev/tty && B || C; } | D
A
Bir sonraki komutun girdisi olarak çıktısına E
ihtiyacınız varsa, ek bir komut grubuna ve akış yönlendirmesine ihtiyacınız olacaktır:
{ { A >&3 && B || C; } | D; } 3>&1 | E
Tüm bunlar size çok gizemli görünüyorsa (bana olduğu gibi) çıkış durumu için özel kabuk değişkenini kullanmanızı ve bununla çalışmanızı öneririm A
:
A
if [ $? -eq 0 ]; then
B
else
C
fi |
D
Daha özlü olmak, ancak çok gizemli olmak istemiyorsanız, bunu öneririm:
A; { [ $? -eq 0 ] && B || C; } | D
(Ayrıca orijinal cevabımı yazdığımda fark etmediğim hvd cevabının son bölümüne de bakınız .)
A
Boru hattının dışına .
A && (B || C) | D
A başarısız olduğunda B, C veya D'nin çalışmasını istemiyorsanız