`less`는 stdin에서 데이터를 가져 와서 사용자의 명령을 계속 읽을 수 있습니까?


47

대부분의 경우 여러 번 수행 했으므로 다음을 사용하여 긴 텍스트를 보는 것이 편리합니다 less.

some_command | less

이제 stdin이 파이프 (FIFO)에 연결되었습니다. 여전히 up / down / quit와 같은 명령을 어떻게 읽을 수 있습니까?


15
lessstdin에서 표시 할 데이터를 읽고 tty에서 명령을 읽습니다. 그들은 다른 것입니다.
William Pursell

2
@WilliamPursell 그래, 알아 그러나 하나의 표준 입력 스트림 만 있습니다.
iBug

4
예, 하나의 입력 스트림과 하나의 tty가 있습니다. lessstdin에서 데이터를 읽고 tty에서 명령을 읽습니다.
윌리엄 Pursell

답변:


52

에서 언급 한 바와 같이 윌리엄 Pursell , less터미널에서 사용자의 키 입력을 읽습니다. /dev/tty제어 터미널을 명시 적으로 엽니 다 . 표준 입력과 별도로 파일 설명자를 제공하여 사용자의 대화식 입력을 읽을 수 있습니다. 필요한 경우 표준 입력에서 표시 할 데이터를 동시에 읽을 수 있습니다. ( 필요한 경우 터미널에 직접 수도 있습니다 .)

당신은 이것을 실행하여 이것을 볼 수 있습니다

some_command | strace -o less.trace -e open,read,write less

입력 주위를 이동하고 종료 less하고 내용을 살펴 less.trace보십시오. open을 볼 수 /dev/tty있으며 파일 설명자 0과 파일을 열 때 반환 된 파일 설명자 /dev/tty(예 : 3) 를 모두 읽습니다 .

이것은 터미널에서 읽고 쓰기를 원하는 프로그램에 대한 일반적인 관행입니다. 예를 들어 , 비밀번호 나 비밀번호 문구를 요청할 때 SSH를 예로들 수 있습니다.

으로 설명 함으로써 schily , 경우 /dev/tty열 수 없습니다, less표준 오류 (파일 기술자 2)에서 읽습니다. less의 사용은 /dev/tty1991 년 4 월 2 일에 릴리스 된 버전 177에서 도입되었습니다.

실행하려고하면 cat /dev/tty | less같은 제안 에 의해 하겐 폰 Eitzen , less개방에 성공 /dev/tty하지만, 때까지 그것에서 모든 입력을받지 않습니다 cat를 닫습니다. 따라서 화면이 비어있는 것을 볼 수 있습니다.를 눌러 CtrlC죽일 때까지 cat(또는 다른 방법 으로 죽일 때까지) 아무것도 없습니다 . 그런 다음 실행 less하는 동안 입력 한 내용을 표시 cat하고 제어 할 수 있습니다.


4
@HagenvonEitzen 컴퓨터가 폭발합니다! Kirk와 Spock이 Mudd의 안드로이드를 충돌시킨 방식과 같습니다.
Barmar

7
트윗 담아 가기 고양이 의 이중 쓸모없는 사용 . 나는 감동.
Andrew Henle

8
@grawity Andrew의 요점은 cat blah |로 대체 될 수 있다고 생각 하며 < blah,이 경우에도 less blah작동하기 때문에 불필요 합니다 (잘, less -f /dev/tty). 그러나 읽는 /dev/tty것은 약간 특별한 경우이며 세 가지 변형 ( cat /dev/tty | less, less < /dev/ttyless -f /dev/tty)은 모두 다른 결과를 생성합니다.
Stephen Kitt

1
/ dev / tty는 항상 올바른 위치를 가리 킵니까? 보통 / dev / ptsX를 사용해야한다고 생각하십니까?
StarWeaver

2
참조 @StarWeaver 이 질문 의 차이에 대한 /dev/tty과를 /dev/pts/....
Stephen Kitt

26

UNIX는 stdin이 리디렉션되는 동안 사용자 입력을 읽는 두 가지 방법을 제공합니다.

  • 원래 방법은 stderr 에서 읽는 것 입니다. Stderr은 쓰기 읽기가 가능하며 POSIX에는 여전히 언급되어 있습니다.

  • 이후의 UNIX 버전 (1979 년경) /dev/tty에는 프로세스 제어 tty를 열 수 있는 드라이버 인터페이스가 추가되었습니다 . 제어 tty가없는 프로세스가 있으므로 열기 시도가 /dev/tty실패 할 수 있습니다. 따라서 친숙한 서면 소프트웨어는 원래 방법으로 대체 된 다음 stderr에서 읽습니다.


11
stderr에서 읽습니까? 새로운 것을 배웠습니다.
iBug

1
누군가 옛 방식을 기억하게되어 기쁘다.
Joshua

3
stderr이 리디렉션에 가장 적게 사용되므로 읽기에 사용되는 이유입니까? 나는 그것과 stdout (또는 리디렉션하기 전에 해당 stdin stdin)의 다른 차이점을 보지 못합니다.
ctrl-alt-delor

4
예, 이는 리디렉션 될 가능성이 가장 적은 파일 디스크립터이기 때문입니다.
schily 2016 년

@ ctrl-alt-delor : 쉘이 stdin, stdout 및 stderr과 함께 실행되는 것이 일반적이었습니다 dup(). 모두 tty에서 모두 열린 동일한 파일 설명의 라이센스가 있습니다. (분명히 POSIX는 여전히 필요 또는 제안 (이 답변이 뭔가를 열 수 없습니다 FD를, 쓰기 / 그 열려진 읽기 수) 말을하지 않는 open("/dev/ttyS0", O_WRONLY)경우에 실패 열려진 읽기..)
피터 코르
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.