プロセス置換は<(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))
動作します。