읽기 및 쓰기에 stderr이 어떻게(그리고 왜) 사용됩니까?

읽기 및 쓰기에 stderr이 어떻게(그리고 왜) 사용됩니까?

~에 따르면힐리의 대답, less열 수 없는 경우 stderr 에서 탐색 명령을 읽습니다 /dev/tty.

나는 다른 프로그램의 stderr 스트림에 작성된 내용을 본 적이 없고 이를 구현하는 방법을 모르기 때문에 이것이 수수께끼인 것 같습니다.

읽기 및 쓰기를 위해 stderr을 공개하는 목적은 무엇입니까? 이것이 작동한다면 최신 시스템에서 어떻게 사용할 수 있습니까? (예를 들어, stdin 대신 stderr로 무언가를 파이프하는 난해한 구문이 있습니까?)

답변1

처음에는 놀랐습니다. 그러나 답변을 읽고 조사해 보면 충분히 간단해 보입니다. 이것이 내가 찾은 것입니다. (결국 놀랄 일은 아니다.)

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

답변2

dup(2)로그인을 하면 로그인한 터미널에 stdin, stdout, stderr이 연결됩니다. 더 정확하게 말하면 tty가 일반적으로 열리고 stdout과 stderr은 첫 번째 파일 설명자에 대한 두 작업의 결과입니다. 이를 통해 stderr에서 읽어 터미널에서 입력을 얻을 수 있습니다.

다른 답변에서 언급했듯이 프로그램은읽다질문에 대한 대화형 답변을 위한 stderr에서.

사용자는 어떤 상황에서 프로그램이 stderr에서 읽고 있는지 알 수 없기 때문에 의도적으로 다른 프로그램에서 stderr에 데이터를 쓰는 것은 쓸모없는 시도입니다.

오늘날의 프로그램은 /dev/tty작동하지 않는 경우에만 stderr을 먼저 열고 사용하려고 시도하는 경우가 많습니다.

stderr에서만 읽는 프로그램은 일반적으로 1979년 이후 수정되지 않았습니다. 이러한 프로그램에는 일반적으로 다음과 같은 구조가 포함됩니다.

int i 1;

또는

i =* 2;

최신 C 컴파일러는 이를 허용하지 않습니다. 따라서 오늘날에는 열리지 않고 /dev/tty대신 stderr에서 대화형 응답을 읽는 프로그램을 찾을 가능성이 거의 없습니다 .

관련 정보