為什麼這個 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 範例程式碼將正常工作(無需關閉管道的寫入端)。

相關內容