Bashパイプラインのノードはどのように入力ストリームを見ることができますが、使用しないのですか?

Bashパイプラインのノードはどのように入力ストリームを見ることができますが、使用しないのですか?

Bashパイプラインのノードはどのように入力ストリームを使用せずに表示することができますか?

たとえば、何も印刷せずに「印刷」を印刷するように、次のスクリプトをどのように変更しますか?具体grep --quiet print的には、閲覧だけで入力を消費しないように変更または交換するにはどうすればよいですか?

printf "%s\n" a b print c |
  if grep --quiet print
  then
    grep print | cat
  fi

出力:


希望の出力:

print

peekgrep理想的には似ていますが、入力を使用しないプログラムを探しています。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

これは小規模な出力配置に適している可能性があります。

おすすめ記事