“exec &> filename”을 실행 한 후 터미널로 출력 복원 수 없습니다. 나는 미친 듯이 시도

다음을 실행하려고합니다.

exec &>filename

이 후 나는 내가 타이핑 한 것을 포함하여 아무것도 볼 수 없습니다.

나는 미친 듯이 시도 exec 1>&1하고 exec 2>&2, 그러나 아무 일도 발생하지 않습니다.

이제 쉘을 죽이지 않고 출력을 stdout으로 리디렉션하고 오류를 각각 stderr로 리디렉션하는 방법은 무엇입니까? 파일 디스크립터가 표준 입력 및 stderr를 참조 할 수있는 유일한 방법입니까?



답변

실행 한 후 exec &>filename쉘의 표준 출력 및 표준 오류로 이동합니다 filename. 표준 입력은 정의상 파일 설명자 0이고 표준 출력은 fd 1이고 표준 오류는 fd 2입니다.

파일 디스크립터는 경로 재 지정되거나 경로 재 지정되지 않습니다. 프로세스가이 디스크립터가 열려 있다고 가정하면 항상 어딘가로 이동합니다. 파일 디스크립터를 경로 재 지정한다는 것은 파일 위치를 변경하는 것을 의미합니다. 당신이 달렸을 때 exec &>filename, stdout과 stderr는 이전에 터미널에 연결되었고에 연결되었습니다 filename.

항상 현재 터미널을 참조하는 방법이 있습니다 : /dev/tty. 프로세스가이 파일을 열면 항상 프로세스의 제어 터미널 중 어느 쪽이든 의미합니다 . 따라서 해당 쉘의 원래 stdout 및 stderr를 다시 가져 오려면 연결된 파일이 여전히 남아 있기 때문에 할 수 있습니다.

exec &>/dev/tty


답변

당신이 원하는

exec &>$(tty)

귀하의 질문에서하고있는 일은 stdout에서 복제하고 이미 파일로 리디렉션 된 원래 stdout 및 stderr을 stderr입니다.

Gilles의 답변이 설명하는 것처럼 tty현재 터미널의 터미널 장치를 반환합니다. 로그인 쉘에서 기본적으로 3 개의 표준 파일 디스크립터가 들어오고가는 곳입니다. 따라서 위의 설명은 ttystdout 및 stderr를 이전과 같이 터미널 장치로 다시 리디렉션 하는 데 사용 합니다.

Gilles의 답변에 대한 귀하의 의견에 따라 이식성에 대해 우려하는 경우 두 가지 방법 ( tty 유틸리티/dev/tty파일 )이 모두 POSIX 표준에 있습니다.

Gilles의 의견에서 복사 한 그대로 :

There's an advantage to /dev/tty: it works even after exec <somefile,
whereas $(tty) would complain “not a tty”


답변