Por que esse coprocessamento gawk trava?

Por que esse coprocessamento gawk trava?

Enquanto tentaConverter data no shell bash, TenteiRecurso de coprocessamento do GNU awk:

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

Este comando trava. Achei que isso poderia ser porque dateestá esperando para ler toda a entrada, então tentei fechar a metade de envio do pipeline:

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

Isso funciona (sim, eu sei que deveria definir OFS=,, mas por enquanto...).

No entanto, dateparece não ter problemas ao processar a entrada à medida que ela chega. Isso fornece a primeira linha de saída imediatamente:

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-

O que está acontecendo?

Responder1

Como muitos outros programas, datea saída do é armazenada em buffer quando stdout não é um tty. Invocando-o, stdbuf -oLvocê terá a saída liberada em cada linha, e seu primeiro código de amostra do Gawk simplesmente funcionará (não há necessidade de fechar a extremidade de gravação do canal).

informação relacionada