Bashのファイル記述子とリダイレクト

Bashのファイル記述子とリダイレクト

誰かがこのコマンドが機能する理由を説明できますか?

gpg --enable-special-filenames --verify --batch \
  <(curl -s https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2.sig) \
  <(curl https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2)

"curl: (23) Failedwriting body (0 != 4096) (23) Failedwriting body" エラー メッセージで失敗しました:

gpg --enable-special-filenames --verify --batch -- '-&3' '-&4' \
  3<(curl -s https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2.sig) \
  4<(curl https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2)

答え1

特定のファイル記述子にリダイレクト使用3< fileプロセスの置き換えを使用して<( ... )2つを組み合わせるには使用する必要があります。両方:

3< <( ... )

スペースは重要です。そうでなければ努力すると解釈されます。ここのドキュメントで終了しますが(有効ではなく、解析エラーが発生します。


コマンドgpgラインは次のようになります。

gpg --enable-special-filenames --verify --batch -- '-&3' '-&4' \
    3< <(curl -s https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2.sig) \
    4< <(curl https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2)

curlこれは、通常のファイルから読み取ったように、最初のコマンドの出力を記述子3にリダイレクトし、2番目のコマンドの出力を記述子4にリダイレクトします。


そのように<( ... ) 働くコマンドを実行し、その出力をFIFOまたはその下のエントリにリンクし、ファイルが最初に作成されたかの/dev/fdよう<( ... )に、コマンドラインの通常の引数でファイルパスを置き換えます。これにより、ファイルパスをリダイレクトなどの他の設定で使用できます。

元のコマンドは最終的に実行されgpg ... 3/dev/fd/63 4/dev/fd/64curl作成された内容に誰も興味がないことを発見してエラーを報告します。また、ファイルが出力gpgに隠されていてもファイルが存在しないというエラーが発生します。curl

関連情報