場合によっては、プロセス置換が期待どおりに機能しないことがあります。次に例を示します:
入力:
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
でのこの失敗 ちょうど最新です。プロセス置換がこのように失敗し、使用すべきでない場合を判断するために知っておくべき一般的なルールはありますか?
私はUbuntu12.04でこのBASHバージョンを使用しています(これはarchとdebianでも見られます):
GNU bash、バージョン4.3.11(1)-リリース(i686-pc-linux-gnu)
承認された回答:
プロセス置換により、特別なファイル(/dev/fd/63
など)が生成されます あなたの例では)これは名前付きパイプの読み取り端のように動作します。このファイルを開いて読み取ることはできますが、書き込むことも、シークすることもできません。
引数を純粋なストリームとして扱うコマンドは機能しますが、指定されたファイルをシークする(または書き込む)ことを期待するコマンドは機能しません。動作するコマンドの種類は、通常フィルターと見なされるものです:cat
、grep
、sed
、gzip
、awk
、など…機能しないコマンドの例は、vi
のようなエディターです。 またはmv
のようなファイル操作 。
gcc
入力ファイルにランダムアクセスを実行して、それらが記述されている言語を検出できるようにしたいと考えています。代わりにgcc
を指定した場合 入力ファイルの言語に関するヒント、ファイルをストリーミングできます:
gcc -x c <(echo 'int main(){return 0;}')
プロセス置換のない、より単純でより単純な形式も機能します:
echo 'int main(){return 0;}' | gcc -x c -
これはbash
に固有のものではないことに注意してください 。プロセス置換をサポートするすべてのシェルは同じように動作します。