答え1
はい、bashでは括弧を使用できます。
(A && B || C) | D
これらの出力A && B || C
はD
。
答え2
次のように書くことができます。
if A; then B; else C; fi | D
B
またはをC
実行したいと言いましたが、A && B || C
そのようなことは起こりませんでした。A
成功したが実行B
が失敗すると実行されますC
。
注1:どういうわけか常にB
成功を保証し、短いバージョンに固執したい場合は、
{ A && B || C; } | D
、( ... )
後者は、最適化することもそうでないかもしれない新しいサブシェルの作成を不必要に強制するからです。
注2:両方のフォーマットがA
出力を生成しないと仮定します。これはあなたの例では本当ですが、必ずしも一般的なものではありません。これは次の方法で回避できます。
A; if [ "$?" -eq 0 ]; then B; else C; fi | D
答え3
受諾者の回答は正確ですが、潜在的なユースケースをカバーしていません。いいえの出力をA
入力として使用してくださいD
。これを達成するには、A
必要に応じてストリームリダイレクトを実行する必要があります。
とにかく出力を削除するには、次の手順を実行します
A
。{ A >/dev/null && B || C; } | D
A
端末から出力を表示するには:{ A >/dev/tty && B || C; } | D
A
後続のコマンドへの入力として出力が必要な場合は、追加のE
コマンドグループとストリームリダイレクトが必要です。{ { A >&3 && B || C; } | D; } 3>&1 | E
これがあなたにとって難しすぎる場合(私のように)、シャットダウン状態に特別なシェル変数を使用し、次を使用することをお勧めA
します。
A
if [ $? -eq 0 ]; then
B
else
C
fi |
D
もっと簡潔ながらもあいまいにならないようにしたい場合は、以下をお勧めします。
A; { [ $? -eq 0 ] && B || C; } | D
(最後の部分も参照してください。hvdの答えもともと答えを書いたときに気づかなかった。 )