我使用 golang 编写过于复杂而无法表达为 bash 函数的程序。程序逐行读取标准输入并将修改后的输出写入标准输出。
在 stdin 方法中迭代所有行的问题是它不会提前退出。例如,以下命令将处理所有行,而不仅仅是 10 行:
cat largefile | custom-program | head -n 10
本机 unix 应用程序如何设法提前退出以及如何在自定义脚本中执行相同的操作?
答案1
在 中yes | head
,yes
在管道另一端关闭后(head
退出时)下一次写入一行时,由 SIGPIPE 信号终止。
在:
(seq 20; sleep 10; seq 10) | head
子 shell 和子 shell 将能够将前 20 行写入管道(因为适合管道缓冲区),然后将安然无恙地休眠 10 秒。与此同时,head
will 已经死亡,但只有当子 shell 向管道写入更多行时,它才会被杀死。
如果您希望命令在返回后立即被终止head
,而不是在head
返回后第一次向管道写入内容,bash
您可以这样做:
{ head; kill "$!"; } < <(exec custom-program < large-file)
(bash
所以恰好将进程替换的pid存储在$!
)。
也可以看看Grep 找到匹配后退出很慢?为了更便携的方法,或者限制查找输出并避免信号 13对于一个适用于find
.
或者相反这个答案(run_under_watch
函数)类似的问答一旦进程终止标准输入变成断管。