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工艺替代使用<( ... ).要将两者结合起来,您需要使用两个都:

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输出中。

相关内容