¿Por qué se bloquea este coproceso boquiabierto?

¿Por qué se bloquea este coproceso boquiabierto?

Mientras intentabaConvertir fecha en bash shell, Lo intentéFunción de coproceso de 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 se bloquea. Pensé que esto podría deberse a que dateestá esperando leer la entrada completa, así que intenté cerrar la mitad de envío de la canalización:

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

Esto funciona (sí, sé que debería configurarlo OFS=,, pero por ahora...).

Sin embargo, dateparece no tener problemas para procesar la entrada a medida que llega. Esto proporciona la primera línea de salida inmediatamente:

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-

¿Qué está sucediendo?

Respuesta1

Como muchos otros programas, datela salida de 's se almacena en un buffer cuando la salida estándar no es un tty. Al invocarlo, stdbuf -oLobtendrá una salida vacía en cada línea, y su primer código de muestra de Gawk simplemente funcionará (no es necesario cerrar el extremo de escritura de la tubería).

información relacionada