Bash

bash 中的文件描述符和重定向

  • March 11, 2016

有人可以解釋為什麼這個命令有效:

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)

這失敗了“捲曲:(23)失敗的寫作主體(0!= 4096)(23)失敗的寫作主體”錯誤消息:

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)

重定向到特定文件描述符使用3< file. 程序替換使用<( ... ). 要將兩者結合起來,您需要同時使用兩者

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,將第二個命令的輸出重定向到描述符 4,就像從普通文件中讀取它們一樣。


<( ... ) 工作方式是它執行命令,其輸出連接到 FIFO 或下的條目/dev/fd,然後<( ... )在命令行中替換為該文件的路徑作為普通參數,就好像它已被寫入首先在那裡。然後可以將文件路徑與其他構造一起使用,例如重定向。

您的原始命令最終執行gpg ... 3/dev/fd/63 4/dev/fd/64,然後curl發現沒有人對它正在編寫的內容感興趣並報告該錯誤。我自己也收到一個錯誤,gpg說這些文件不存在,儘管它被埋在curl輸出中。

引用自:https://unix.stackexchange.com/questions/269104