![프로세스 대체 및 cat: 표준 입력을 읽을 수 없습니다.](https://linux55.com/image/77820/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%20%EB%8C%80%EC%B2%B4%20%EB%B0%8F%20cat%3A%20%ED%91%9C%EC%A4%80%20%EC%9E%85%EB%A0%A5%EC%9D%84%20%EC%9D%BD%EC%9D%84%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
프로세스 대체가 <(cat)
작동하지 않습니다. 왜?
head <(cat)
cat: -: Input/output error
추가 파일 설명자를 사용할 수 있지만 위의 내용이 작동하지 않는 이유를 이해할 수 없습니다.
# Using file descriptor 3 to reroute the input
(head <(cat <&3)) 3<&0
답변1
에서 bash
다음을 수행하는 경우:
$ cat <(ps -j)
PID PGID SID TTY TIME CMD
3887 16480 16480 pts/29 00:00:00 bash
3888 3888 16480 pts/29 00:00:00 cat
3889 16480 16480 pts/29 00:00:00 ps
16480 16480 16480 pts/29 00:00:00 bash
존재하다 zsh
:
$ cat <(ps -j)
PID PGID SID TTY TIME CMD
3935 3935 16480 pts/29 00:00:00 ps
3936 3936 16480 pts/29 00:00:00 cat
16480 16480 16480 pts/29 00:00:00 zsh
존재하다 ksh93
:
$ cat <(ps -j)
PID PGID SID TTY TIME CMD
3946 16480 16480 pts/29 00:00:00 ps
3947 3947 16480 pts/29 00:00:00 cat
16480 16480 16480 pts/29 00:00:00 ksh
3개의 셸 모두에서 ps
프로세스는 cat
터미널의 전경 프로세스 그룹과 다른 프로세스 그룹에 있습니다. 많은 쉘이 백그라운드에서 실행되는 명령에 대해 하는 것처럼 문제를 피하기 위해 zsh
최소한 stdin을 tty로 리디렉션할 수 있습니다 ./dev/null
stdin이 터미널이 아닌 경우 명령은 제대로 작동하지만 여기서는 cat
터미널의 포그라운드 프로세스 그룹에 속하지 않기 때문에 터미널에서 읽는다는 것은 신호를 수신한다는 의미 SIGTTIN
이므로 정지됩니다. 여기서는 우아하게 처리되지 않습니다. 귀하의 경우에는 SIGTTIN
무시되거나 차단된 것으로 보이며 EIO 오류가 발생합니다(포그라운드 프로세스 그룹에 있지 않고 무시/차단될 때 제어 터미널에서 읽으려고 할 때 발생함 SIGTTIN
).
존재하다
(head <(cat <&3)) 3<&0
그러나 우리는 포그라운드에서 서브셸을 시작하고 그 안에 있는 모든 프로세스는 동일한 프로세스 그룹에 속하므로 터미널에서 읽을 수 있습니다. 명시적인 리디렉션을 포함함으로써 zsh
우리는 zsh
에서 리디렉션을 우회합니다 /dev/null
. 다른 껍질과 함께
(head <(cat))
작동할 것입니다.