![eval 不评估 echo?](https://linux22.com/image/123742/eval%20%E4%B8%8D%E8%AF%84%E4%BC%B0%20echo%EF%BC%9F%20.png)
我正在尝试编写一些将 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
显示echo
和OK
已导出,但未设置:
$ declare -p echo
declare -x echo
因此,您需要引用命令替换 ( eval "$(./auth)"
) 或将分号放在那里ssh-agent
。