이 gawk coprocess가 중단되는 이유는 무엇입니까?

이 gawk coprocess가 중단되는 이유는 무엇입니까?

구경하는 동안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

다른 많은 프로그램과 마찬가지로 datestdout이 tty가 아닐 때 의 출력은 버퍼링됩니다. 이를 호출하면 stdbuf -oL각 줄의 출력이 플러시되고 첫 번째 Gawk 샘플 코드가 제대로 작동합니다(파이프의 쓰기 끝을 닫을 필요가 없습니다).

관련 정보