"exec &>filename"을 실행한 후 출력을 터미널로 복원합니다.

"exec &>filename"을 실행한 후 출력을 터미널로 복원합니다.

나는 다음을 수행하려고합니다 :

exec &>filename

그 후에는 내가 입력한 내용을 포함하여 아무것도 볼 수 없습니다.

exec 1>&1미친 듯이 노력했지만 exec 2>&2아무 일도 일어나지 않았습니다.

이제 쉘을 종료하지 않고 출력을 stdout으로 리디렉션하고 오류를 stderr로 별도로 리디렉션하려면 어떻게 해야 합니까? 파일 설명자가 표준 [in|out]put 및 stderr을 참조하는 유일한 방법입니까?

답변1

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

파일 설명자는 리디렉션되거나 리디렉션되지 않습니다. 항상 어딘가로 이동합니다(프로세스에 이 설명자가 열려 있다고 가정). 파일 설명자를 리디렉션한다는 것은 파일 설명자가 가는 위치를 변경하는 것을 의미합니다. 를 실행하면 exec &>filenamestdout 및 stderr은 이전에 터미널에 연결되었고 이제 에 연결됩니다 filename.

항상 현재 터미널을 참조하는 방법이 있습니다./dev/tty. 프로세스가 이 파일을 열면 이는 항상 프로세스의 파일이제어 터미널, 어느 쪽이든 상관 없습니다. 따라서 해당 셸의 원래 stdout 및 stderr을 되돌리려는 경우 연결된 파일이 여전히 존재하기 때문에 그렇게 할 수 있습니다.

exec &>/dev/tty

답변2

당신이 원하는

exec &>$(tty)

귀하의 질문에서 수행하고 있는 작업은 파일로 리디렉션된 원본 stdout 및 stderr을 stdout 및 stderr에 복사하는 것입니다.

Giles의 답변에 설명된 대로 tty현재 터미널의 단말 장치가 반환됩니다. 이는 로그인 셸에서 시작/끝까지 세 가지 표준 파일 설명자의 기본 위치입니다. 따라서 위의 명령문은 tty이전과 마찬가지로 stdout 및 stderr을 터미널 장치로 다시 리디렉션하는 이점을 활용합니다.

이식성이 걱정된다면(Giles의 답변에 대한 귀하의 의견을 바탕으로) 두 가지 접근 방식(터미널 유틸리티그리고/dev/tty문서)은 POSIX 표준의 일부입니다.

Gilles의 의견을 그대로 복사하려면 다음을 수행하세요.

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

관련 정보