2011-01-07 13 views
3

これはシェルをどのように印刷しますか?二重リダイレクションテスト

echo foo | while read line; do echo $line; done < <(echo bar) 

私はそれはエラーメッセージが表示されますどちらも、echo foo | barまたはfoo < <(bar)に評価することが期待されます。 bashで

は、パイプが単に破棄されるようになります4.1.5:ダッシュで

bar 

sh: Syntax error: redirection unexpected 
+0

なぜ重要ですか?デザインが悪いので、標準入力を複数回リダイレクトしないでください。 – Benoit

+0

それはもっと精神的な運動でした - 私はそれが有効なシンタックスであり、それと "合理的"な何かを行うべきであることに気付きました。 – l0b0

答えて

3

ダッシュは、プロセス置換(<())をサポートしていません。

比較している各シェルでサポートされている構文を使用すると、表示される動作は一致します。これを試してください:

echo hello | cat < inputfile 

"hello"ではなく "inputfile"の内容が表示されます。私が試したいくつかのシェルのうち、Zシェルだけが両方を示していました。

これは、POSIXは、パイプラインとリダイレクトについてこう言われる、

のCommand1の標準出力はcommand2の標準入力に接続しなければなりません。コマンドの標準入力、標準出力、または両方は、コマンドの一部であるリダイレクション演算子によって指定されたリダイレクションの前に、パイプラインによって割り当てられるとみなされます(リダイレクション参照)。

Iは、上記の例の場合、パイプラインはcatにSTDINを割り当て、その後、リダイレクトがそれをオーバーライドすることを意味するためにこれを解釈します。

+0

標準を引用するための+1 – SiegeX