次のパイプラインがあります。
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
終了するには、以下に説明する方法を使用できます。tail
sed
気づくこの種のwhile read
ループは、シェルでテキストを処理する正しい方法ではありません。。少なくとも、次のようなものが必要です。
while IFS= read -r line; do
printf '%s\n' "$line"
case $line in
(*xxx*) break
esac
done
代わりsed /xxx/q
に、入力が非常に小さくない場合は非常に非効率的です。