このgawkコルーチンはなぜ停止しますか?

このgawkコルーチンはなぜ停止しますか?

努力中Bashシェルから日付を変換する、私は努力した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

他の多くのプログラムと同様に、datestdoutの出力はttyではないときにバッファリングされます。これを呼び出すと、各行stdbuf -oLの出力がフラッシュされ、最初のGawkサンプルコードが正しく機能します(パイプの書き込みの終わりを閉じずに)。

関連情報