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


15

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

exec &>filename

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

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

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


1
흠 ... 왜 대화식 쉘의 stderr / stdout을 리디렉션합니까? 이 exec구문은 일반적으로 서브 쉘에서 실행되는 스크립트에서 출력을 파일 등으로 리디렉션하는 데 사용됩니다. 대화식 세션에서 사용되지 않습니다.
Martin von Wittich

3
@MartinvonWittich 나는 exec에 대한 진술에 동의합니다. 나는 동의한다. 난 그냥 놀아 :)
user917279

답변:


23

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

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

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

exec &>/dev/tty

1
@Joseph R.이 $ (tty)가 대답했듯이 / dev / pty0을 보여 주지만 명령이 잘 작동합니다. 더 명확한 답변을 주셔서 감사합니다.
user917279

2
@ user917279 그들은 다른 유닉스 맛에 대한 작업의 관점에서 똑같이 휴대 가능합니다. /dev/tty경우에 작동 $(tty)하지 않습니다 /dev/tty반면 프로세스로 한 작품, (여전히 단자 과정을 연결하는 일이 있어야만로 가장 적합한 당신이 기대할 수있는) 단자를 지배했다 $(tty)단자는 여전히 열 수 있어야 표준 입력에.
Gilles 'SO- 악마 그만'

11

당신이 원하는

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”

효과가있다! 감사합니다. echo $ (tty)는 / dev / pty0 (cygwin에서)을 제공합니다 .stdin, stdout과 어떻게 관련이 있으며 위의 문장은 어떻게됩니까? 이 질문을 별도의 질문으로해야하는지 알려주십시오.
user917279

@ user917279 답변이 업데이트되었습니다.
Joseph R.

조셉 감사합니다. Giles의 답변을보기 전에이 질문을 게시했습니다. 대단히 감사합니다. Giles의 대답을 허용 된 것으로 표시하도록 허용하십시오. 그것이 나의 것과 같은 멍청한 마음조차도 제대로 이해하도록 만들었 기 때문입니다.
user917279

2
장점은 /dev/tty다음과 같습니다. "t가 아니라"고 불평 exec <somefile하는 반면 에도 작동합니다 $(tty).
Gilles 'SO- 악마 그만'

@Gilles 특징적으로 깨달은 의견에 감사드립니다 :)
Joseph R.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.