나는 동일한 일을 기대 cat <(cat)
하고 수행합니다. 즉, stdin에서 stdout으로 행을 복사합니다. cat | cat
내 이해는 둘 다 cat
하위 쉘에서 하나를 실행하고 cat
하위 쉘의 stdout을 임시 명명된 파이프로 리디렉션한 다음 cat
현재 쉘에서 다른 하나를 실행하여 해당 stdin을 파이프로 리디렉션한다는 것입니다.
대신 cat <(cat)
터미널에 입력하면 입력 라인이 복사되지 않고 ^D
신호를 내보낼 수 없지만 EOF
예상 cat | cat
대로 작동합니다.
추가 실험으로 cat =(cat)
에 비슷한 어려움이 있는지 확인했지만 cat <(cat)
예상대로 작동했습니다. a에 대한 모든 stdin이 ^D
한 번에 stdout에 복사되었습니다.
누구든지 zsh가 뒤에서 무엇을 하는지 이해하도록 도와줄 수 있나요?
답변1
a | b
STDOUT
그냥 사용a
하고STDIN
연결하세요b
dup/dup2
. 두 명령 모두 병렬로 실행됩니다.a =(b)
매개변수를a
임시 파일 이름으로 바꾸십시오. 임시 파일이 전달되기 전에 생성되어야 하기 때문에b
이전에 실행됩니다 .a
a
a <(b)
매개변수를 명명된 파이프로 바꿉니다a
.a
그리고b
병렬로 실행합니다. 이제 상황이 좀 더 복잡해집니다.•
b
백그라운드에 있으므로 터미널에서 읽을 수 없습니다.strace -p $PID
프로세스를 보기 위해 두 번째 cat 프로세스에 연결을 사용하여 직접 테스트할 수 있습니다 .•
a
또한 명명된 파이프에서 읽으려고 시도했지만b
읽을 수 없기 때문에 아무것도 읽을 수 없습니다.• 이는 기본적으로 교착 상태에 빠져
a
읽기를 시도b
하지만b
읽을 수 없고STDIN
쓸 수 없음을 의미합니다.a
백그라운드 프로세스 및 터미널에 대한 자세한 내용은 다음을 참조하세요.남자 난교:
작업 제어를 위한 사용자 인터페이스 구현을 용이하게 하기 위해 운영 체제는 다음 개념을 유지합니다.현재 터미널 프로세스 그룹 ID. 이 프로세스 그룹의 구성원(현재 터미널의 프로세스 그룹 ID와 동일한 프로세스 그룹 ID를 가진 프로세스)은 키보드에서 생성된 신호를 수신합니다. 예를 들어 지능을 신호하다. 이러한 과정을 거친다고 합니다전망.배경프로세스는 프로세스 그룹 ID가 터미널의 프로세스 그룹 ID와 다른 프로세스입니다. 이러한 프로세스는 키보드에서 생성된 신호에 영향을 받지 않습니다. 포그라운드 프로세스만 터미널을 읽거나 쓸 수 있습니다(사용자가 stty tostop을 사용하여 지정한 경우). 터미널에서 읽기(그리고 stty tostop이 적용될 때 쓰기)를 시도하는 백그라운드 프로세스가 전송됩니다.시그투잡히지 않으면 프로세스가 중단되는 커널의 터미널 드라이버에서 발생하는 신호입니다.