パイプラインで「ifne」を使用する - 複数のコマンドを実行する

パイプラインで「ifne」を使用する - 複数のコマンドを実行する

私のスクリプトで私は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削除することが可能です。その他のバッファリング/非バッファリングソリューション。提供された例には影響しますが、実際のユースケースには影響しない可能性があります。

関連情報