パイプラインBからDへ? - A&&B ||

パイプラインBからDへ? - A&&B ||

A && B || C | DBまたはCがDにパイプされるようにコマンド構造を書き換える方法はありますか?

現在のコマンドを使用すると、Bのみが実行されるか、CとDが実行されます。

たとえば、

ここに画像の説明を入力してください。

答え1

はい、bashでは括弧を使用できます。

(A && B || C) | D

これらの出力A && B || CD

答え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の答えもともと答えを書いたときに気づかなかった。 )

関連情報