如何在管道关闭时提前退出?

如何在管道关闭时提前退出?

我使用 golang 编写过于复杂而无法表达为 bash 函数的程序。程序逐行读取标准输入并将修改后的输出写入标准输出。

在 stdin 方法中迭代所有行的问题是它不会提前退出。例如,以下命令将处理所有行,而不仅仅是 10 行:

cat largefile | custom-program | head -n 10

本机 unix 应用程序如何设法提前退出以及如何在自定义脚本中执行相同的操作?

答案1

在 中yes | headyes在管道另一端关闭后(head退出时)下一次写入一行时,由 SIGPIPE 信号终止。

在:

(seq 20; sleep 10; seq 10) | head

子 shell 和子 shell 将能够将前 20 行写入管道(因为适合管道缓冲区),然后将安然无恙地休眠 10 秒。与此同时,headwill 已经死亡,但只有当子 shell 向管道写入更多行时,它才会被杀死。

如果您希望命令在返回后立即被终止head,而不是在head返回后第一次向管道写入内容,bash您可以这样做:

{ head; kill "$!"; } < <(exec custom-program < large-file)

bash所以恰好将进程替换的pid存储在$!)。

也可以看看Grep 找到匹配后退出很慢?为了更便携的方法,或者限制查找输出并避免信号 13对于一个适用于find.

或者相反这个答案(run_under_watch函数)类似的问答一旦进程终止标准输入变成断管。

相关内容