uss less file1 file2
를 사용하면 “less buffer viewer”에 두 파일이 표시되지만 less file1 file2 | cat
stdout에 추가 된 두 파일의 내용을 인쇄합니다. 그것이 “더 적은 버퍼 뷰어”를 보여 주거나 다음 명령을 위해 stdout에 출력을 생성해야하는지 어떻게 알 수 있습니까? 이를 위해 어떤 메커니즘이 사용됩니까?
답변
less
텍스트를 표준 출력으로 인쇄합니다. 표준 외출
- (A)에 단자 (/ 디바이스 / TTY?)하고, 기본 버퍼 뷰어를 연다
- 스루 파이프를 사용하여 다른 programm에로 배관 할 때 | (
less text | cut -d: -f1
) - > ( ) 로 파일 을 리디렉션 할 때 파일로
less text > tmp
“isa tty ” 라는 C 함수가 있는데,이 함수 는 출력이 tty (4.81, main.c, 112 행 이하)로 가는지 확인합니다. 그렇다면 버퍼 뷰어를 사용하고 그렇지 않으면처럼 동작 cat
합니다.
bash에서는 test를 사용할 수 있습니다 (참조 man test
)
- -t FD 파일 디스크립터 FD가 터미널에서 열립니다.
- -p FILE이 존재하며 명명 된 파이프입니다.
예:
[[ -t 1 ]] && \
echo 'STDOUT is attached to TTY'
[[ -p /dev/stdout ]] && \
echo 'STDOUT is attached to a pipe'
[[ ! -t 1 && ! -p /dev/stdout ]] && \
echo 'STDOUT is attached to a redirection'
답변
less
stdout
터미널 인지 확인하고 그렇지 않은 경우 처럼 동작합니다 cat
(EOF까지 stdin을 stdout에 복사합니다).
이 기능을 사용하면 항상 출력 (예 : --help
출력)을 보내면서 less
파일로 쉽게 리디렉션 할 수있는 스크립트 나 프로그램을 작성할 수 있습니다 . some_command --fullhelp > help.txt
stdin의 스페이스 바가 텍스트 등을 통해 페이지를 넘길 때까지 기다리면 짜증이납니다 . 일부 명령 (예 🙂 man
은 자체 출력을 확인하여 호출기를 통해 출력을 보낼지 여부를 결정합니다. 을 실행하면을 (를) man ls > ls.txt
호출하지 않습니다 $PAGER
.
less
파이프 라인에 스테이지를 더 추가 할 때 하나의 라이너에서 편집하는 것을 잊어 버린 경우 고양이 같은 동작이 편리합니다.
less
터미널 크기 (화면 크기, 한 번에 몇 줄을 표시할지 알기 위해)를 알아야합니다. 는 ioctl(2)
그것의 사용 stdout
어쨌든 비 터미널의 경우를 처리 피할 수 있도록, 비 터미널에 ENOTTY를 반환합니다. less
실제로 isatty(3)
터미널 크기를 확인하기 전에 사용 하지만 isatty
tty 전용 ioctl을 시도하고 오류가 없는지 확인하여 작동합니다.
more(1)
(최소한 util-linux 버전 과 같은) 간단한 호출기 조차도이 기능을 가지고 있습니다. 왜냐하면 아마도이 경우를 위해 구현하는 가장 단순한 제정신 행동 일 것입니다.
무언가 를 less
(예를 들어 grep foo bar.txt | less
)에 파이프 할 때 /dev/tty
키보드 입력 을 위해 열어야 합니다. (로이 작업을 수행하는 것을 볼 수 있습니다 echo foo | strace less
).