以编程方式关闭管道/退出

以编程方式关闭管道/退出

我有一个像这样的管道:

  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/qbut,除非输入非常小,否则效率非常低。

相关内容