Почему этот сопроцесс 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 будет просто работать (не нужно закрывать конец записи канала).

Связанный контент