어떻게 읽고 쓰는 데 stderr을 사용합니까?


12

에 따르면 schily에 의해이 답변 , less그것을 열 수 아니라면 표준 오류에서 탐색 명령을 읽는다 /dev/tty.

나는 다른 프로그램의 stderr 스트림에 아무것도 쓰는 것을 본 적이 없기 때문에 당혹 스럽습니다.

읽기와 쓰기 모두에 stderr의 개방 목적은 무엇입니까? 그리고 이것이 유용한 경우 현대 시스템에서 어떻게 사용합니까? (예를 들어 stdin 대신 stderr에 무언가를 파이프하는 약간의 구문이 있습니까?)

답변:


7

나는 처음에 놀랐다. 그러나 답을 읽고 약간의 조사를 한 후에는 간단 해 보입니다. 여기 내가 찾은 것이 있습니다. (결국 놀라움은 없었습니다.)

리디렉션 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에게 감사합니다.


이에 대해서는 이 질문을/dev/tty 참조하십시오 .
Stephen Kitt 2016 년

6

로그인하면 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됩니까? 아니면 항상 stderrtty에 연결 됩니까?
Draconis 2016 년

1
로그인하면 stderr이 로그인 터미널에 연결됩니다.
schily 2016 년

2
i =+ 1완벽 유효한 C이고, 동일하다 i = (+1). 물론, 전자는 언더 핸드 C 컨테스트의 좋은 후보입니다.
G. Sliepen

1
그것은 단지 경고를 만드는 것일 수 있습니다. 1977 년에 코드를 C에서 다른 코드로 변경했습니다.
schily

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.