コマンドが失敗した場合、パイプは早く終了します。

コマンドが失敗した場合、パイプは早く終了します。

私が探しています前のコマンドが失敗した場合はパイプを終了します。しかし、私はこの問題に対するより一般的な解決策を探しています。

chlist -q -v -m -r $sourcelist | \
grep '^USER:' | \
chlist -q -v -f - $superlist

問題は、最初のchlistが失敗した場合、2番目のchlistに入力がなければ本当に悪いことです。

最初のchlistの出力を一時ファイルに入れてからシャットダウン状態を確認すること(パイプをまったく使用しないなど)に加えて、2番目のchlistが実行されないようにするソリューションはありますか?

答え1

パイプライン内のすべてのコマンドは非同期で始まるため、最後のコマンドが入力なしで実行されないようにするには、提案したようにパイプラインを分割する必要があります。またはchlist(わかりません)、そうするオプションがあるかもしれません。

答え2

もう少し実験したところ、私は次のアイデアを思いつきましたが、私の考えではこれが実現可能で非常に一般的な解決策かもしれません。

( rm -f FAIL ; chlist -q -v -m -r $sourcelist || touch FAIL ) | \

( test -e FAIL || chlist -q -v -f - $superlist )

(ここでは明確にするためにgrep省略しましたが、ここではうまくいきます)

別の(クリーン?)バリエーション:

( chlist -q -v -m -r $sourcelist || touch FAIL ) | \

( rm FAIL 2>/dev/null || chlist -q -v -f - $superlist )

答え3

最初のコマンドの出力にダミーラインを追加して最後のコマンドの入力要件を満たしていますが、アクションをトリガーしたくない場合はどうすればよいですか?

関連情報