bash
이것은 쓸모없는 명령이라는 것을 알고 있지만 in 또는 in 을 입력 zsh
하면 입력하라는 메시지가 표시되지만 한 줄 이후에만 반환되는 반면, ? 를 클릭할 때까지 다른 줄을 입력할 수 있는 이유를 알고 싶습니다 .cat | ls
cat
</dev/stdin tr -d 'e' | ls
Ctrl + 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
( cat
stdout) cat
파이프도 종료됩니다.
stdin에서 읽지 않고 stdout으로 출력하지 않는 모든 프로그램에서 동일한 동작이 관찰될 수 있습니다. 예를 들어:
cat | uname -a
노트: </dev/stdin
중복됩니다. 표준 입력을 표준 입력으로 리디렉션합니다.