次の行は明らかです。
echo "bla" | foo | bar
しかし、私の下の人々もそうしますか?
echo "bla" | bar <(foo)
echo "bla" | bar < <(foo)
標準入力から「bla」を読むのはなぜですかfoo
?bar
もちろん、コーディングして確認することはできますが、定義された動作であるか、依存してはいけない機能を活用しているかどうかはわかりません。
ベストアンサー1
これはシェルによって異なり、AFAICS に文書化されていません。ksh
とのbash
最初のケースでは、foo
同じ標準入力がと共有されますbar
。彼らは生産量のために戦うでしょうecho
。
例えば、
$ seq 10000 | paste - <(tr 1 X)'
1 X
2 X042
3 X043
4 X044
5 X045
[...]
paste
他のテキストブロックを読み込んでいる間に、出力から他のすべてのテキストブロックを読み取る証拠を見ることができます。seq
tr
を使用すると、zsh
外部標準入力を取得します(端末ではなく、シェルが対話型でない場合は、/dev/null
端末からcmd &
)。ksh
(原産地)プロセスの交換をサポートする唯一のBourne様シェルですzsh
。bash
では、stdinがの出力から提供されるパイプであることにecho "bla" | bar < <(foo)
注意してください。これは明確に定義された動作です。この場合、stdinがすべてであるように見え、パイプも提供されます。bar
foo
foo
echo
ksh
zsh
bash
3つのシェルすべてで一貫した動作が必要になり、動作が文書化されずに変更される可能性があるため、将来も備えたい場合は、次のように作成します。
echo bla | { bar <(foo); }
確かにfoo
stdinもパイプから出てきますecho
(しかし、なぜそうしたいのかわかりません)。または:
echo bla | bar <(foo < /dev/null)
foo
確認してくださいいいえパイプから読みますecho
。または:
{ echo bla | bar 3<&- <(foo <&3); } 3<&0
foo
の現在のバージョンと同じMakeのstdin外部標準入力ですzsh
。