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)
這失敗了“捲曲:(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
輸出中。