exec를 사용하여 stderr 리디렉션

exec를 사용하여 stderr 리디렉션

모든 명령 오류 출력을 다음과 같은 파일로 리디렉션하려고 합니다.

exec 2>errlog.txt

그러나 위의 줄을 실행하면 입력에 전혀 응답하지 않는 "동결" 터미널이 발생합니다. 더욱 흥미로운 점은 리디렉션된 표준 출력을 사용하는 것이 exec잘 작동한다는 것입니다. 오류 리디렉션에 어떤 문제가 있나요?

답변1

exec 2>errlog.txt

( 또는 [1] bash대신 )을 사용하면ksh93dash아니요터미널을 동결시키세요. 이는 쉘의 프롬프트와 입력한 문자가 에코되는 것을 방지할 뿐입니다.

하지만 나중에 ;-)에서 검색할 수 있습니다 . 또는 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] 지침은 맨페이지 및 /를 참조하세요 .ECHOtermios(3)stty echostty(1)

관련 정보