bash 가 브로큰 파이프를 감지하지 못합니다.
글쓴이: vamf12 / 작성시간: 월, 2009/02/02 - 9:55오후
쉘 스크립트로 무한 반복되는 프로그램을 짜고, 이것을 파이프로 다른 프로그램에서 받습니다.
문제는 받아 주는 프로그램이 종료 되어도, 쉘스크립트가 계속 돌아 갑니다.
#!/bin/sh #loop.sh while true; do date sleep 1 done
이것을 실행합니다.
$ loop.sh | cat
이렇게 바로 실행한 상태에서는 cat이 종료 되면(외부에서 강제로 cat을 종료)loop.sh도 종료 됩니다.
$ (loop.sh | cat)
서브쉘로 실행 시켰습니다. 이경우 cat을 종료 해도 loop.sh가 종료 되지 않습니다.
#!/bin/sh #echoloop.sh while true; do echo `date` sleep 1 done
특이한 것은 이렇게 echo를 사용해서 출력하면 파이프(출력용 파일 디스크럽터)가 닫힌것을 감지하고 스크립트가 종료 됩니다.
제 생각은 bash는 파일 디스크럽터의 변화를 감지 하지 않는 것 같습니다. echo를 사용하면, echo는 bash내부에서 동작하기 때문에 출력이 불가능하다는 사실을 bash가 알게 되고, 바로 종료해버리는 것 같습니다.
#!/bin/sh #errchekloop.sh while true; do date || exit 1 sleep 1 done
이렇게 종료 상태를 체크 했더니 종료가 잘됩니다.
test 명령어를 확인해봤는데, 출력이 리다이렉션 되었는지만 테스트 할수 있더군요... ㅠ_ㅠ
그렇다면 다른 방법은 없을까요? while 반복이 시작될때 출력이 가능한지 확인하고 싶습니다. (아쉽게도 echo -n ''은 않되더군요.)
Forums:
댓글 달기