将 heredoc 与管道组合失败

将 heredoc 与管道组合失败

我正在尝试使用 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 将不会对 做任何事情!。我的问题是:

  1. 我偶尔会想将脚本复制粘贴到命令行中。六个月后,我就会忘记这件事了。
  2. 为什么 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)

相关内容