less file1 file2 고양이 - 왜 작동하나요?

less file1 file2 고양이 - 왜 작동하나요?

사용하면 less file1 file2Less Buffer Viewer에 표시된 두 파일을 얻지만 less file1 file2 | cat표준 출력에 추가된 두 파일의 내용이 인쇄됩니다. "덜 버퍼 뷰어"를 표시해야 하는지 아니면 다음 명령을 위해 stdout으로 출력을 생성해야 하는지 less는 어떻게 알 수 있습니까? 이를 위해 어떤 메커니즘이 사용됩니까?

답변1

less텍스트를 표준 출력으로 인쇄합니다. 표준 출력은 다음과 같습니다.

  • 단말기(/dev/tty?) 및 기본 버퍼 뷰어를 엽니다.
  • 통해관로less text | cut -d: -f1|( )를 사용하여 다른 프로그램으로 파이프하는 경우
  • 문서less text > tmp> ( )를 사용하여 리디렉션하는 경우

"isa"라는 C 함수가 있습니다.단말기" 출력이 tty(4.81 미만, main.c, 112행)로 전송되는지 확인합니다. 그렇다면 버퍼 뷰어를 사용하고, 그렇지 않으면 처럼 동작합니다 cat.

Bash에서는 테스트를 사용할 수 있습니다( 참조 man test).

  • -t FD 파일 설명자 FD가 터미널에서 열립니다.
  • -p 파일이 존재하고 명명된 파이프입니다.

예:

[[ -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'

답변2

lessstdout터미널 인지 확인 하고 cat그렇지 않은 경우에는 그대로 동작합니다(EOF까지 stdin을 stdout으로 복사).

이 기능을 사용 하면 파일로 쉽게 리디렉션하는 동시에 --help출력과 같은 출력을 항상 보내는 스크립트나 프로그램을 작성할 수 있습니다 . 표준 입력에서 스페이스바를 눌러 텍스트 등을 넘기는 것을 계속 기다리고 있다면 less너무 나쁠 것입니다. some_command --fullhelp > help.txt일부 명령(예: man)은 자체 출력을 확인하여 호출기를 통해 출력을 보낼지 여부를 결정합니다. 실행하면 man ls > ls.txt절대로 $PAGER.

less파이프라인에 더 많은 단계를 추가할 때 라인에서 편집하는 것을 잊어버린 경우 고양이와 같은 동작이 유용합니다.


less터미널 크기(화면 크기, 한 번에 표시되는 줄 수 파악)를 파악해야 합니다. 이것ioctl(2)on을 사용하면 stdout비터미널에서 ENOTTY가 반환되므로 어쨌든 비터미널 사례 처리를 피할 수는 없습니다. less실제로 사용isatty(3)터미널 크기를 확인하기 전에 isattytty 전용 ioctl을 시도하고 오류를 확인하여 작동합니다.

이와 같은 간단한 호출기 more(1)(적어도 util-linux 버전)에도 이 기능이 있습니다. 왜냐하면 이것이 아마도 이 상황에 대해 구현할 수 있는 가장 간단한 정상적인 동작이기 때문입니다.


뭔가를 파이프할 때 주의하세요입력하다 less(예 : ), 키보드 입력을 위해 grep foo bar.txt | less열려 있어야 합니다 . /dev/tty( 를 사용하여 이 작업을 수행하는 것을 볼 수 있습니다 echo foo | strace less.

관련 정보