web-dev-qa-db-ja.com

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

どうしたの?

3
muru

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

1
LL3