为何无法通过管道将内容传入gpg --recv-keys命令?
问题解决:PKGBUILD提取PGP密钥后无法传给gpg --recv-keys
核心原因:gpg --recv-keys是从命令行参数读取密钥ID,默认不会读取标准输入(stdin),所以你之前用管道、重定向的方式都没用——这些都是把内容传给stdin,但gpg根本不读。
正确的解决方案
方法1:命令替换直接传递参数
把提取密钥的命令用$(...)包裹,直接作为gpg --recv-keys的参数,和手动粘贴的效果完全一致:
gpg --recv-keys $(grep validpgpkeys PKGBUILD | sed -n "s/^.*'\(.*\)'.*$/\1/ p")
方法2:用xargs传递参数(适合多密钥场景)
如果PKGBUILD里有多个PGP密钥,或者提取的输出有换行/空格分隔,用xargs把stdin内容转换成命令行参数:
grep validpgpkeys PKGBUILD | sed -n "s/^.*'\(.*\)'.*$/\1/ p" | xargs gpg --recv-keys
为什么之前的方法无效?
- 管道
|:前一个命令的输出传给gpg的stdin,但gpg --recv-keys不处理stdin内容,直接忽略。 - 进程替换
<(...):把命令输出包装成临时文件(比如/dev/fd/63),gpg会把这个文件名当成密钥ID,自然报错不是有效密钥。 - 重定向
< <(...):同样是把内容传给stdin,gpg不读取,没用。 <<<:语法错误,即使修正为<<< "$(command)",gpg还是不读stdin,依然无效。
额外排查点
如果上述方法还是不行,先检查提取命令的输出是否有多余空格、换行或特殊字符:
# 查看提取的输出是否干净 grep validpgpkeys PKGBUILD | sed -n "s/^.*'\(.*\)'.*$/\1/ p"
如果有多余换行,可加tr -d '\n'清理:
gpg --recv-keys $(grep validpgpkeys PKGBUILD | sed -n "s/^.*'\(.*\)'.*$/\1/ p" | tr -d '\n')
内容的提问来源于stack exchange,提问作者user1884295
相关产品推荐
相关产品推荐

