Bash:プロセス置換と標準入力

Bash:プロセス置換と標準入力

次の行は明らかです。

echo "bla" | foo | bar

しかし、私の下の人々もそうしますか?

echo "bla" | bar <(foo)
echo "bla" | bar < <(foo)

標準入力から「bla」を読むのはなぜですかfoobar

もちろん、コーディングして確認することはできますが、定義された動作であるか、依存してはいけない機能を活用しているかどうかはわかりません。

ベストアンサー1

これはシェルによって異なり、AFAICS に文書化されていません。kshとのbash最初のケースでは、foo同じ標準入力がと共有されますbar。彼らは生産量のために戦うでしょうecho

例えば、

$ seq 10000 | paste - <(tr 1 X)'
1       X
2       X042
3       X043
4       X044
5       X045
[...]

paste他のテキストブロックを読み込んでいる間に、出力から他のすべてのテキストブロックを読み取る証拠を見ることができます。seqtr

を使用すると、zsh外部標準入力を取得します(端末ではなく、シェルが対話型でない場合は、/dev/null端末からcmd &)。ksh(原産地)プロセスの交換をサポートする唯一のBourne様シェルですzshbash

では、stdinがの出力から提供されるパイプであることにecho "bla" | bar < <(foo)注意してください。これは明確に定義された動作です。この場合、stdinがすべてであるように見え、パイプも提供されます。barfoofooechokshzshbash

3つのシェルすべてで一貫した動作が必要になり、動作が文書化されずに変更される可能性があるため、将来も備えたい場合は、次のように作成します。

echo bla | { bar <(foo); }

確かにfoostdinもパイプから出てきますecho(しかし、なぜそうしたいのかわかりません)。または:

echo bla | bar <(foo < /dev/null)

foo確認してくださいいいえパイプから読みますecho。または:

{ echo bla | bar 3<&- <(foo <&3); } 3<&0

fooの現在のバージョンと同じMakeのstdin外部標準入力ですzsh

おすすめ記事