web-dev-qa-db-ja.com

BASHプロセスの置換が一部のコマンドで機能しないのはなぜですか?

場合によっては、プロセスの置換が期待どおりに機能しないことがあります。次に例を示します。

入力:

gcc <(echo 'int main(){return 0;}')

出力:

/dev/fd/63: file not recognized: Illegal seek
collect2: error: ld returned 1 exit status

入力:

ただし、別のコマンドで使用すると、期待どおりに動作します。

grep main <(echo 'int main(){return 0;}')

出力:

int main(){return 0;}

他のコマンドでも同様のエラーが発生することに気づきました(つまり、プロセス置換からのファイルを想定しているコマンドは/dev/fd/63などを使用できません)。このgccの失敗は、ごく最近のことです。プロセスの置換がこの方法で失敗し、使用すべきでない場合を判断するために知っておくべきいくつかの一般的なルールはありますか?

Ubuntu 12.04でこのBASHバージョンを使用しています(これはArchとdebianでも見られます)。
GNU bash、バージョン4.3.11(1)-release(i686-pc-linux-gnu)

29
Lotney

プロセスの置換により、名前付きパイプの読み取り側のように動作する特別なファイル(例では/dev/fd/63など)が生成されます。このファイルを開いて読み取ることはできますが、書き込みやシークはできません。

引数を純粋なストリームとして扱うコマンドは機能しますが、与えられたファイルをシークする(またはそれらに書き込む)ことを期待するコマンドは機能しません。機能するコマンドの種類は、通常フィルターと見なされるものです:catgrepsedgzipawk、 etc ...機能しないコマンドの例は、viのようなエディターまたはmvのようなファイル操作です。

gccは、入力ファイルにランダムアクセスを実行して、書き込まれた言語を検出できるようにしたいと考えています。代わりにgccに入力ファイルの言語に関するヒントを与える場合は、ファイル:

gcc -x c <(echo 'int main(){return 0;}')

プロセス置換のない、より単純でより単純な形式も機能します。

echo 'int main(){return 0;}' | gcc -x c -

これはbashに固有のものではないことに注意してください。プロセス置換をサポートするすべてのシェルは同じように動作します。

33
Celada