我正在尝试使用 curl 登录 API。由于请求需要 JSON,因此我使用以下命令:
curl -s -X POST -H "Content-Type: application/json" \
$API_URL/auth -d@- <<EOF
{
"id": "[email protected]",
"password": "!password!"
}
EOF
...一切运行正常。我得到的结果类似如下:
{"access_token":"jXed...I5mQ=","expires_in":3600}
但是当我尝试在变量中捕获输出时,它不起作用。
我试过了:
x=$(curl ...)
...但失败了bash: !password!: event not found
是的,我的密码做以 开头!
;这是 API 的测试安装,因此我使用了弱密码。
我知道如果我使用set +H
,或者从脚本运行它,bash 将不会对 做任何事情!
。我的问题是:
- 我偶尔会想将脚本复制粘贴到命令行中。六个月后,我就会忘记这件事了。
- 为什么 bash 甚至尝试在 heredoc 中执行此操作?
由于上述的怪异之处!
,我尝试将结果通过管道传输到read
:
(curl ...
EOF
) | read x
...但随后它会以某种方式破坏 heredoc,并且服务器会以相当于“无效 JSON”的方式做出响应。
如果我使用cat
而不是curl
,则 heredoc 顺便说一句似乎是空的。
答案1
为了避免event not found
错误,只需set +H
在脚本中使用 ,包括即可。这是无害的,您可以添加注释来解释它。
| read x
根本不起作用;见http://tiswww.case.edu/php/chet/bash/FAQ, 具体来说:
E4) 如果我将命令的输出通过管道传输到“读取变量”中,为什么读取命令完成后输出没有显示在 $variable 中?
在 bash 中,它在子 shell 中| foo
运行foo
。它无法更改父 shell 中的变量。
改用x=$(whatever)
。