Bashパイプラインのノードはどのように入力ストリームを使用せずに表示することができますか?
たとえば、何も印刷せずに「印刷」を印刷するように、次のスクリプトをどのように変更しますか?具体grep --quiet print
的には、閲覧だけで入力を消費しないように変更または交換するにはどうすればよいですか?
printf "%s\n" a b print c |
if grep --quiet print
then
grep print | cat
fi
出力:
希望の出力:
print
peek
grep
理想的には似ていますが、入力を使用しないプログラムを探しています。peek print
入力に「print」が含まれている場合はエラーコード0が返され、それ以外の場合は0以外のエラーコードが返されます。
peek
私の例で動作する方法は次のとおりです。
printf "%s\n" a b print c |
if peek print
then
grep print | cat
fi
出力:
print
単に結果をフィルタリングするのではなく、これを行う理由は、grep print
エラーが発生する可能性がある空の検索結果を処理しないためです。
ベストアンサー1
私が考えることができる簡単な方法の1つは、出力に一時ストアを使用することです。これは、以下のようにコードを最小限に変更することで実現できます。
atmp=$(mktemp "/tmp/XXXXXX")
printf "%s\n" a b print c | tee $atmp |
if grep --quiet print
then
grep print $atmp
fi
rm $atmp #cleanup
これは小規模な出力配置に適している可能性があります。