我有一个像这样的管道:
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
将在其后第一次写入时退出。
如果您希望ql_receiver_lock_holder
退出tail
后立即sed
退出而不等待下一次写入标准输出,您可以使用以下描述的方法
注意这种while read
循环不是在 shell 中处理文本的正确方法。至少,你需要类似的东西:
while IFS= read -r line; do
printf '%s\n' "$line"
case $line in
(*xxx*) break
esac
done
来取代sed /xxx/q
but,除非输入非常小,否则效率非常低。