
나는 다음을 수행하려고합니다 :
exec &>filename
그 후에는 내가 입력한 내용을 포함하여 아무것도 볼 수 없습니다.
exec 1>&1
미친 듯이 노력했지만 exec 2>&2
아무 일도 일어나지 않았습니다.
이제 쉘을 종료하지 않고 출력을 stdout으로 리디렉션하고 오류를 stderr로 별도로 리디렉션하려면 어떻게 해야 합니까? 파일 설명자가 표준 [in|out]put 및 stderr을 참조하는 유일한 방법입니까?
답변1
을 실행한 후 exec &>filename
쉘의 표준 출력 및 표준 오류는 로 이동합니다 filename
. 정의에 따르면 표준 입력은 파일 설명자 0, 표준 출력은 fd 1, 표준 오류는 fd 2입니다.
파일 설명자는 리디렉션되거나 리디렉션되지 않습니다. 항상 어딘가로 이동합니다(프로세스에 이 설명자가 열려 있다고 가정). 파일 설명자를 리디렉션한다는 것은 파일 설명자가 가는 위치를 변경하는 것을 의미합니다. 를 실행하면 exec &>filename
stdout 및 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”