プロセス置換と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))

動作します。

おすすめ記事