GNU/Linux >> Linux の 問題 >  >> Linux

一部のコマンドで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でのこの失敗 ちょうど最新です。プロセス置換がこのように失敗し、使用すべきでない場合を判断するために知っておくべき一般的なルールはありますか?

私はUbuntu12.04でこのBASHバージョンを使用しています(これはarchとdebianでも見られます):
GNU bash、バージョン4.3.11(1)-リリース(i686-pc-linux-gnu)

>

承認された回答:

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

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

gcc 入力ファイルにランダムアクセスを実行して、それらが記述されている言語を検出できるようにしたいと考えています。代わりにgccを指定した場合 入力ファイルの言語に関するヒント、ファイルをストリーミングできます:

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

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

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

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


Linux
  1. 「kill-9」が機能しない場合はどうなりますか?

  2. Avconvを使用したメタデータのマッピングが機能しませんか?

  3. Bash翻訳ファイルにすべてのエラーテキストが含まれていないのはなぜですか?

  1. Linux –Setuidが機能しないのはなぜですか??

  2. `source`の後にコマンド名を入力するとオートコンプリートが機能しないのはなぜですか?

  3. Linux –ロケールEs_mxは機能するがEsは機能しないのはなぜですか?

  1. なぜ`exit&`が機能しないのですか?

  2. Tomcat がポート 8080 で動作するのに 80 で動作しないのはなぜですか?

  3. ショートサーキットコマンドのシーケンスで失敗した場合、bash がエラーで停止しないのはなぜですか?