Warum bleibt dieser Gawk-Coprozess hängen?

Warum bleibt dieser Gawk-Coprozess hängen?

Beim Versuch,Datum in der Bash-Shell konvertieren, Ich habe es versuchtCoprocessing-Funktion von GNU awk:

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

Dieser Befehl hängt. Ich dachte, das könnte daran liegen, dass dateer darauf wartet, die gesamte Eingabe zu lesen, also habe ich versucht, die sendende Hälfte der Pipeline zu schließen:

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

Das funktioniert (ja, ich weiß, ich sollte es einstellen OFS=,, aber im Moment …).

Es scheint jedoch datekein Problem zu geben, die Eingaben zu verarbeiten, wenn sie eingehen. Dadurch wird sofort die erste Ausgabezeile angezeigt:

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-

Was ist los?

Antwort1

Wie bei vielen anderen Programmen datewird die Ausgabe von gepuffert, wenn stdout kein tty ist. Wenn Sie es über aufrufen, stdbuf -oLwird die Ausgabe in jeder Zeile geleert, und Ihr erster Gawk-Beispielcode funktioniert einfach (das Schreibende der Pipe muss nicht geschlossen werden).

verwandte Informationen