You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法通过管道将内容传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:05:25