8

bash 関数で 2 つのプロセス置換パイプを参照しようとすると、最初に参照されたパイプのみが機能します。2 つ目は、次のような「不正なファイル記述子」エラーを返します。

$ foo(){
> cat "$1"
> cat "$2"
> }
$ foo <(echo hi) <(echo bye)
hi
cat: /dev/fd/62: Bad file descriptor
$ 

1 つが参照されると、2 番目のパイプがドロップされるように見えますが、a) どのドキュメントでもこの動作を確認できないようであり、b) そうでないことを望みます。=)

私が間違っていることについてのアイデアはありますか?FWIWコマンドラインの代わりにMac OS XのFileMergeグラフィカル差分ツールを使用するラッパーを作成するためにこれを行っています。これは、コマンドラインから複数のパイプを操作することにすでに満足しています。

-ロブ

4

4 に答える 4

7

まず、@Michael Krelin は、これが OS X (v3.2.48) で提供される bash のバージョンに関連していることについて正しいと思います。関数が最初の外部コマンドを実行した後、ファイル記述子が破棄されるように私のテストから見えます。

$ bar() { echo "Args: $*"; echo "First ext command:"; ls /dev/fd; echo "Second ext command:"; ls /dev/fd; }
$ bar <(echo hi) <(echo bye)
Args: /dev/fd/63 /dev/fd/62
First ext command:
0   1   2   3   4   5   6   62  63
Second ext command:
0   1   2   3   4   5   6

ls2 つのリストの間で /dev/fd/62 と 63 が消えていることに注意してください。ただし、回避策を見つけたと思います。壊れやすいfdを壊れないfdにコピーしてから、消える可能性があります。

$ baz() { exec 3<"$1" 4<"$2"; ls /dev/fd; ls /dev/fd; cat /dev/fd/3; cat /dev/fd/4; }
$ baz <(echo hi) <(echo bye)
0   1   2   3   4   5   6   62  63
0   1   2   3   4   5   6
hi
bye
于 2012-10-01T18:43:51.523 に答える
4

/bin/bashOSX (3.2.48) に付属のは失敗します。macports のもの (4.2.37 —/opt/local/bin/bashインストールされている場合は通常) は正常に動作します。バージョンなのかビルドなのかわかりません。おそらく、このスクリプトには macports bash を使用したいかもしれません。確かに、すべての mac に macports が必要なので、そうしていると思います ;-)

于 2012-10-01T14:14:40.840 に答える
0

これは問題のようです: http://bugs.alpinelinux.org/issues/1465

于 2012-11-27T19:15:41.137 に答える