eval 不评估 echo?

eval 不评估 echo?

我正在尝试编写一些将 API 访问令牌存储在 bash 变量中的内容,因此我ssh-agent在您使用 的地方对其进行建模eval

ssh代理

如果您ssh-agent单独运行,它会输出类似以下内容:

SSH_AUTH_SOCK=/tmp/ssh-XXXXXXXXXXXX/agent.NNNNN; export SSH_AUTH_SOCK;
SSH_AGENT_PID=NNNNN; export SSH_AGENT_PID;
echo Agent pid NNNNN;

如果你用 运行它eval $(ssh-agent),它会输出:

Agent pid NNNNN

...以及eval在当前 shell 中设置环境变量的结果。

我的剧本

我的脚本的结尾如下所示($JSON来自一些早期的curl命令):

cat <<EOF
API_ACCESS_TOKEN=$(echo $JSON | jq '.access_token')
API_EXPIRES_AT=$(echo $JSON | jq '.expires_at')
export API_ACCESS_TOKEN API_EXPIRES_AT
echo OK
EOF

当我使用 运行它时eval $(./auth),它设置正确$API_ACCESS_TOKEN并且$API_EXPIRES_AT(所以eval有效),但它没有打印“OK”

我究竟做错了什么?

答案1

再次查看该输出ssh-agent。您错过了;每个命令后的终止。

有了这些,脚本就会做你想做的事。

如果没有分号,shell 将把字符串(此处文档)中的命令作为一条命令执行,并删除换行符。

答案2

这似乎也是一个分词的问题。该脚本输出(本质上)是这样的:

VAR=foo
export VAR
echo OK

但由于您使用了不带引号的命令替换,它会被分割,并被赋予eval不同的单词,就像您输入:

eval VAR=foo export VAR echo OK

之后,Bashdeclare显示echoOK已导出,但未设置:

$ declare -p echo
declare -x echo

因此,您需要引用命令替换 ( eval "$(./auth)") 或将分号放在那里ssh-agent

相关内容