为什么这个 gawk 协进程挂起?

为什么这个 gawk 协进程挂起?

在尝试的同时在 bash shell 中转换日期, 我试过GNU awk 的协进程功能

gawk -F, -v cmd='date +"%Y-%m-%d %H:%M:%S" -f-' '{print $5 |& cmd; cmd |& getline d; $5 = d}1' foo

该命令挂起。我认为这可能是因为date正在等待读取整个输入,所以我尝试关闭管道的发送一半:

gawk -F, -v cmd='date +"%Y-%m-%d %H:%M:%S" -f-' '{print $5 |& cmd; close(cmd, "to"); cmd |& getline d; $5 = d}1' foo

这有效(是的,我知道我应该设置OFS=,,但现在......)。

然而,date处理输入似乎没有问题。这立即给出了第一行输出:

d='Thu Apr 27 2017 23:19:47 GMT+0700 (ICT)'
(echo "$d"; sleep 1m; echo "$d") |
  date +"%Y-%m-%d %H:%M:%S" -f-

这是怎么回事?

答案1

与许多其他程序一样,date当 stdout 不是 tty 时, 的输出会被缓冲。通过调用它,stdbuf -oL您将在每一行刷新输出,并且您的第一个 Gawk 示例代码将正常工作(无需关闭管道的写入端)。

相关内容