`cat ls`를 실행할 때 `cat`의 동작을 이해하지 못합니다.

`cat ls`를 실행할 때 `cat`의 동작을 이해하지 못합니다.

bash이것은 쓸모없는 명령이라는 것을 알고 있지만 in 또는 in 을 입력 zsh하면 입력하라는 메시지가 표시되지만 한 줄 이후에만 반환되는 반면, ? 를 클릭할 때까지 다른 줄을 입력할 수 있는 이유를 알고 싶습니다 .cat | lscat</dev/stdin tr -d 'e' | lsCtrl + D

답변1

1초 후에만 아무것도 인쇄하는 것과 같은 이유입니다.

(echo abc; sleep 1; echo def) | tr -d e |cat

그리고표준 출력파이프로 리디렉션하고,최대유틸리티는 출력 버퍼링을 시작하고 완전한 데이터 블록이 확보된 후에만 출력물을 기록합니다. (블록의 크기는 구현 세부 사항이며 몇 킬로바이트일 수 있습니다.) 버퍼링을 비활성화하는 데 사용할 수 있는 유틸리티가 있습니다. 다음을 참조하세요.파이프라인에서 버퍼링 끄기.

그러나 일부 구현에서는 cat버퍼링을 수행하지 않고 즉시 작성합니다. 여기에는 최소한 GNU 및 Busybox 구현이 포함됩니다. cat버퍼링에 대한 일반 효과는 다음과 같습니다.POSIX가 지정되지 않았습니다.,오직 cat -u,예방하다완충기.

여기, 그 이후로 ls아무것도 읽지 않았어표준 입력따라서 파이프라인은 사용자가 입력하는 것보다 더 빨리 완료되고 종료될 수 있습니다. 따라서 cat/ 무엇이든 쓰기 시작할 때쯤에는 tr파이프가 이미 닫혀 있고 작성자는 SIGPIPE를 받고 종료됩니다. 읽은 내용은 버퍼링 없이 바로 여기에 기록 되므로 cat첫 번째 입력 라인 바로 다음에 신호를 받습니다. 반면에, tr아무것도 쓰기 위해 전체 버퍼를 얻기를 기다리기 때문에 첫 번째 입력 라인에서는 트리거되지 않습니다. 충분한 데이터를 입력하면 tr결국 파이프에 기록되고 신호를 받고 종료됩니다.

당신이 말했듯이, 파이핑은 ls아무것도 읽지 않기 때문에 바보입니다. 대신에 true또는 같은 것을 사용할 수 있습니다 false.

답변2

cat매개변수가 없으면 stdin에서 읽고 입력의 첫 번째 줄을 기다립니다.대화형 장치를 참조할 때 stdin은 라인 버퍼링됩니다., 표준 출력으로 출력하고 표준 입력으로 리디렉션됩니다 ls. ls표준 입력에서 전혀 읽지 않으므로 파일 목록을 표준 출력으로 출력하고 종료됩니다. ls파이프의 -end가 닫혀 있으므로 ls( catstdout) cat파이프도 종료됩니다.

stdin에서 읽지 않고 stdout으로 출력하지 않는 모든 프로그램에서 동일한 동작이 관찰될 수 있습니다. 예를 들어:

cat | uname -a

노트: </dev/stdin중복됩니다. 표준 입력을 표준 입력으로 리디렉션합니다.

관련 정보