私のスクリプトで私はifne
使用していますmoreutils
パック。この行は次のように単純化できます。
printf "asdf\n" | ifne cat - && echo "stream not empty"
ifne
ストリームが空でない場合にのみ実行されます。しかし、echo "stream not empty"
ストリームが空でない場合にのみ2番目のコマンド()が実行されるようにするにはどうすればよいですか?たとえば、「ストリームが空ではない」と印刷されないように、次のコマンドをどのように変更しますか?
printf "" | ifne cat - && echo "stream not empty"
cat
括弧で囲むとecho
構文エラーが発生します。
printf "" | ifne (cat - && echo "stream not empty")
ストリームが空でない場合にのみ、最後のコマンドをどのように実行できますか?
答え1
次の形式を使用してください。
printf "" | ifne sh -c "cat - ; echo 'stream not empty' "
出力はなしで、次のようになります。
printf "bb\n" | ifne sh -c "cat - ; echo 'stream not empty' "
出力は次のとおりです
bb
stream not empty
答え2
ifne
終了コードは、入力が空であるかどうかによって設定されないため、期待&&
どおり||
に機能しません。 Babyyの答えに代わるものは、pee
同じパッケージを使用することです。
printf "asdf\n" | pee 'ifne cat -' 'ifne echo "stream not empty"'
同様に動作しますtee
が、入力ストリームを複数のパイプにコピーして、各引数を実行するコマンドとして処理します。 (tpipe
同様のコマンドですが、若干異なる動作をします。)
しかし、考えられる問題は、各コマンドがstdoutに並列に書き込まれ、入力/出力のバッファリングと長さによって出力がインターリーブされたり、実行ごとに異なる可能性があることです(実際にはレース)。sponge
代わりに(同じパッケージ)を使用またはcat
削除することが可能です。その他のバッファリング/非バッファリングソリューション。提供された例には影響しますが、実際のユースケースには影響しない可能性があります。