모든 명령 오류 출력을 다음과 같은 파일로 리디렉션하려고 합니다.
exec 2>errlog.txt
그러나 위의 줄을 실행하면 입력에 전혀 응답하지 않는 "동결" 터미널이 발생합니다. 더욱 흥미로운 점은 리디렉션된 표준 출력을 사용하는 것이 exec
잘 작동한다는 것입니다. 오류 리디렉션에 어떤 문제가 있나요?
답변1
exec 2>errlog.txt
( 또는 [1] bash
대신 )을 사용하면ksh93
dash
아니요터미널을 동결시키세요. 이는 쉘의 프롬프트와 입력한 문자가 에코되는 것을 방지할 뿐입니다.
하지만 나중에 ;-)에서 검색할 수 있습니다 . 또는 errlog.txt
를 맹목적으로 입력하여 쉽게 확인할 수 있습니다 . 이 명령은 제대로 작동하고 출력을 표시합니다. 또한 ^C 및 ^Z도 예상대로 작동합니다.pwd<Enter>
ls<Enter>
여기에는 두 가지 작업이 있습니다.
1) bash
항상 프롬프트를 제어 터미널이 아닌 stderr에 인쇄하십시오.
2) 명령줄 편집을 구현하기 위해 bash에서 사용하는 readline 라이브러리는 터미널 [2]의 에코 플래그를 끄고 사용자가 입력한 문자를 stderr에 인쇄합니다.
bash 쉘을 시작하면 bash --noediting
(readline 라이브러리를 사용하지 않게 됨) 입력한 문자가 tty 드라이버에 의해 에코되고 프롬프트만 리디렉션된 stderr로 이동합니다.
이 문제에 대한 해결책은 tee
프로세스 대체를 사용하는 것입니다.
exec 2> >(trap '' INT; tee errlog.txt >/dev/tty)
[1] 참조여기이렇게 하면 일부 쉘이 심하게 충돌하는 이유와 예상대로 작동하는 이유를 설명하십시오 zsh
.
c_lflag
[2] 지침은 맨페이지 및 /를 참조하세요 .ECHO
termios(3)
stty echo
stty(1)