대부분의 사람들이 여러 번 해봤듯이 다음 명령을 사용하면 긴 텍스트를 보는 것이 편리합니다 less
.
some_command | less
이제 표준 입력이 파이프(FIFO)에 연결됩니다. up/down/exit와 같은 명령을 어떻게 계속 읽나요?
답변1
말한 바와 같이윌리엄 퍼셀, less
터미널에서 사용자의 키 입력을 읽습니다. 이는 /dev/tty
제어 터미널을 명시적으로 엽니다. 이는 사용자의 대화형 입력을 읽을 수 있는 표준 입력과 별도로 파일 설명자를 제공합니다. 필요한 경우 디스플레이를 위해 표준 입력에서 동시에 데이터를 읽을 수 있습니다. (또한쓰다필요한 경우 터미널로 직접 이동하세요. )
다음을 실행하면 이런 일이 발생하는 것을 볼 수 있습니다.
some_command | strace -o less.trace -e open,read,write less
입력을 이동하고 종료 less
하고 내용을 살펴보세요 . 파일 설명자 0과 열 때 반환된 파일 설명자 (아마도 3) 에서 less.trace
열리고 읽는 것을 볼 수 있습니다 ./dev/tty
/dev/tty
이는 터미널에서 읽고 쓰는 것을 보장하려는 프로그램의 일반적인 관행입니다. 예를 들면 SSH입니다.예를 들어비밀번호나 비밀번호 문구를 묻는 경우.
~처럼설명했다통과교활한, /dev/tty
열 수 없으면 less
표준 오류(파일 설명자 2)에서 읽습니다. less
의 사용은 /dev/tty
1991년 4월 2일에 출시된 버전 177에서 도입되었습니다.
cat /dev/tty | less
다음과 같이 달리려고 하면제안통과하겐 폰 아이젠, less
성공적으로 열리지만 /dev/tty
닫힐 때까지 입력을 받지 못합니다. 따라서 kill (또는 kill)을 cat
누르기 전까지는 아무것도 없는 빈 화면이 표시 되며 런타임 중에 입력한 내용이 표시되어 이를 제어할 수 있습니다.CtrlCcat
less
cat
답변2
표준 입력이 리디렉션될 때 UNIX는 사용자 입력을 읽는 두 가지 방법을 제공합니다.
원래 방법은 읽는 것입니다.표준 에러. Stderr는 글쓰기를 위해 열려있습니다그리고읽어보세요. POSIX에서는 여전히 언급되어 있습니다.
이후 버전의 UNIX(1979년경)에는
/dev/tty
프로세스의 제어 tty를 열 수 있는 드라이버 인터페이스가 추가되었습니다. tty 를 제어하지 않는 프로세스가 있기 때문에 열려는 시도가/dev/tty
실패 할 수 있습니다. 따라서 친숙한 작성 소프트웨어는 원래 방법으로 돌아가서 stderr에서 읽기를 시도합니다.