有人可以解释一下为什么这个命令有效:
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
输出中。