프로세스 대체 및 cat: 표준 입력을 읽을 수 없습니다.

프로세스 대체 및 cat: 표준 입력을 읽을 수 없습니다.

프로세스 대체가 <(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))

작동할 것입니다.

관련 정보