에 따르면 schily에 의해이 답변 , less
그것을 열 수 아니라면 표준 오류에서 탐색 명령을 읽는다 /dev/tty
.
나는 다른 프로그램의 stderr 스트림에 아무것도 쓰는 것을 본 적이 없기 때문에 당혹 스럽습니다.
읽기와 쓰기 모두에 stderr의 개방 목적은 무엇입니까? 그리고 이것이 유용한 경우 현대 시스템에서 어떻게 사용합니까? (예를 들어 stdin 대신 stderr에 무언가를 파이프하는 약간의 구문이 있습니까?)
에 따르면 schily에 의해이 답변 , less
그것을 열 수 아니라면 표준 오류에서 탐색 명령을 읽는다 /dev/tty
.
나는 다른 프로그램의 stderr 스트림에 아무것도 쓰는 것을 본 적이 없기 때문에 당혹 스럽습니다.
읽기와 쓰기 모두에 stderr의 개방 목적은 무엇입니까? 그리고 이것이 유용한 경우 현대 시스템에서 어떻게 사용합니까? (예를 들어 stdin 대신 stderr에 무언가를 파이프하는 약간의 구문이 있습니까?)
답변:
나는 처음에 놀랐다. 그러나 답을 읽고 약간의 조사를 한 후에는 간단 해 보입니다. 여기 내가 찾은 것이 있습니다. (결국 놀라움은 없었습니다.)
리디렉션 stdin, stdout 및 stderr이 동일한 장치에 연결된 것으로 예상됩니다.
#ctrl-alt-delor:~$
#↳ ll /dev/std*
lrwxrwxrwx 1 root root 15 Jun 3 20:58 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Jun 3 20:58 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Jun 3 20:58 /dev/stdout -> /proc/self/fd/1
#ctrl-alt-delor:~$
#↳ ll /proc/self/fd/*
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/0 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/1 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/2 -> /dev/pts/12
따라서 대부분의 리디렉션 (stderr 인 경우)은 리디렉션되지 않습니다. stderr은 여전히 터미널에 연결되어 있습니다. 따라서 키보드 입력을 얻기 위해 읽을 수 있습니다.
예기치 않은 방향으로 사용되는 파일을 중지시키는 유일한 방법은 규칙이며 파이프는 단방향입니다.
다른 예를 들어보십시오.
cat | less
less
터미널을 읽으려고 할 때 페이지가 끝나면 잘못됩니다 (터미널을 읽는 것처럼 놀라운 일이 아닙니다 cat
).
/dev/tty
더 신비 롭습니다 /proc/self
.에 대한 링크가 아닙니다 .
#ctrl-alt-delor:~$
#↳ ll /dev/tty
crw-rw-rw- 1 root tty 5, 0 Jun 29 09:18 /dev/tty
참조 내 전류를 제어 단자와`는 / dev / tty` 사이에 무슨 관계? 설명을 위해. 링크에 대한 @StephenKitt에게 감사합니다.
로그인하면 stdin, stdout 및 stderr가 로그인 한 터미널에 연결됩니다.보다 정확하게 말하면, tty는 일반적으로 열리고 stdout 및 stderr은 dup(2)
첫 번째 파일 설명자에 대한 두 가지 조작 의 결과입니다 . 이것은 터미널에서 입력을 얻기 위해 stderr에서 읽을 수 있습니다.
다른 답변에서 언급했듯이 프로그램 은 질문에 대한 대화 형 답변을 얻기 위해 stderr에서 읽습니다 .
사용자는 프로그램이 stderr에서 읽는 환경을 알 수 없으므로 다른 프로그램에서 의도적으로 stderr에 데이터를 쓰는 것은 쓸모없는 시도입니다.
오늘날 프로그램은 일반적으로 /dev/tty
작동하지 않는 경우에만 stderr 을 열고 사용 하려고합니다 .
stderr에서만 읽은 프로그램은 일반적으로 1979 년 이전부터 수정 된 적이 없으며 일반적으로 이러한 프로그램에는 다음과 같은 구문이 포함됩니다.
int i 1;
또는
i =* 2;
최신 C 컴파일러에서는 허용되지 않습니다. 결과적으로 오늘은 결코 열리지 /dev/tty
않지만 stderr에서 대화 형 회신을 읽는 프로그램을 찾을 가능성은 거의 없습니다 .
stderr
될 때 tty에 연결 stdin
됩니까? 아니면 항상 stderr
tty에 연결 됩니까?
i =+ 1
완벽 유효한 C이고, 동일하다 i = (+1)
. 물론, 전자는 언더 핸드 C 컨테스트의 좋은 후보입니다.
/dev/tty
참조하십시오 .