プログラムでパイプ/終了を閉じる[閉じる]

プログラムでパイプ/終了を閉じる[閉じる]

次のパイプラインがあります。

  tail -n0 -f  "${my_input}" | ql_receiver_lock_holder | while read line; do
   echo "$line" >> "${my_output}";
   # xxx: how can I programmatically close the pipeline at this juncture?
  done & disown;

私の質問:xxxを表示するパイプをプログラムで閉じる方法はありますか?おそらく電話をかけることができますが、exit 0;現在のパイプを何とか閉じる方法があるかどうかを知りたいです。

ベストアンサー1

存在する:

tail -n0 -f -- "$my_input" |
  ql_receiver_lock_holder |
  sed /xxx/q > "$my_output"
  • sed含まれている最初の行を読み込んで終了しますxxx
  • ql_receiver_lock_holderその後、stdout(現在破損しているパイプ)に最初に書き込むと終了します(SIGPIPEによって終了しました)。
  • 同様にtail、最初の書き込みで終了します。

stdout への次の書き込みを待たずにすぐにql_receiver_lock_holder終了するには、以下に説明する方法を使用できます。tailsed

気づくこの種のwhile readループは、シェルでテキストを処理する正しい方法ではありません。。少なくとも、次のようなものが必要です。

while IFS= read -r line; do
  printf '%s\n' "$line"
  case $line in
    (*xxx*) break
  esac
done

代わりsed /xxx/qに、入力が非常に小さくない場合は非常に非効率的です。

おすすめ記事