태그 보관물: cat

cat

적은 file1 file2 | 고양이 — 왜 작동합니까? 그것이 “더 적은 버퍼 뷰어”를 보여 주거나

uss less file1 file2를 사용하면 “less buffer viewer”에 두 파일이 표시되지만 less file1 file2 | catstdout에 추가 된 두 파일의 내용을 인쇄합니다. 그것이 “더 적은 버퍼 뷰어”를 보여 주거나 다음 명령을 위해 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'


답변

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

이 기능을 사용하면 항상 출력 (예 : --help출력)을 보내면서 less파일로 쉽게 리디렉션 할 수있는 스크립트 나 프로그램을 작성할 수 있습니다 . some_command --fullhelp > help.txtstdin의 스페이스 바가 텍스트 등을 통해 페이지를 넘길 때까지 기다리면 짜증이납니다 . 일부 명령 (예 🙂 man은 자체 출력을 확인하여 호출기를 통해 출력을 보낼지 여부를 결정합니다. 을 실행하면을 (를) man ls > ls.txt호출하지 않습니다 $PAGER.

less파이프 라인에 스테이지를 더 추가 할 때 하나의 라이너에서 편집하는 것을 잊어 버린 경우 고양이 같은 동작이 편리합니다.


less터미널 크기 (화면 크기, 한 번에 몇 줄을 표시할지 알기 위해)를 알아야합니다. 는 ioctl(2)그것의 사용 stdout어쨌든 비 터미널의 경우를 처리 피할 수 있도록, 비 터미널에 ENOTTY를 반환합니다. less실제로 isatty(3)터미널 크기를 확인하기 전에 사용 하지만 isattytty 전용 ioctl을 시도하고 오류가 없는지 확인하여 작동합니다.

more(1)(최소한 util-linux 버전 과 같은) 간단한 호출기 조차도이 기능을 가지고 있습니다. 왜냐하면 아마도이 경우를 위해 구현하는 가장 단순한 제정신 행동 일 것입니다.


무언가 less (예를 들어 grep foo bar.txt | less)에 파이프 할 때 /dev/tty키보드 입력 을 위해 열어야 합니다. (로이 작업을 수행하는 것을 볼 수 있습니다 echo foo | strace less).


답변