사용자 명령을 읽을 수 있으면서도 표준 입력에서 데이터를 "덜" 얻을 수 있는 방법은 무엇입니까?

사용자 명령을 읽을 수 있으면서도 표준 입력에서 데이터를 "덜" 얻을 수 있는 방법은 무엇입니까?

대부분의 사람들이 여러 번 해봤듯이 다음 명령을 사용하면 긴 텍스트를 보는 것이 편리합니다 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/tty1991년 4월 2일에 출시된 버전 177에서 도입되었습니다.

cat /dev/tty | less다음과 같이 달리려고 하면제안통과하겐 폰 아이젠, less성공적으로 열리지만 /dev/tty닫힐 때까지 입력을 받지 못합니다. 따라서 kill (또는 kill)을 cat누르기 전까지는 아무것도 없는 빈 화면이 표시 되며 런타임 중에 입력한 내용이 표시되어 이를 제어할 수 있습니다.CtrlCcatlesscat

답변2

표준 입력이 리디렉션될 때 UNIX는 사용자 입력을 읽는 두 가지 방법을 제공합니다.

  • 원래 방법은 읽는 것입니다.표준 에러. Stderr는 글쓰기를 위해 열려있습니다그리고읽어보세요. POSIX에서는 여전히 언급되어 있습니다.

  • 이후 버전의 UNIX(1979년경)에는 /dev/tty프로세스의 제어 tty를 열 수 있는 드라이버 인터페이스가 추가되었습니다. tty 를 제어하지 않는 프로세스가 있기 때문에 열려는 시도가 /dev/tty실패 할 수 있습니다. 따라서 친숙한 작성 소프트웨어는 원래 방법으로 돌아가서 stderr에서 읽기를 시도합니다.

관련 정보