この 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

他の多くのプログラムと同様に、dateの出力は stdout が tty でない場合はバッファリングされます。 を介して呼び出すと、stdbuf -oL各行で出力がフラッシュされ、最初の Gawk サンプル コードがそのまま機能します (パイプの書き込み側を閉じる必要はありません)。

関連情報