我正在使用一个 HTTP API,它需要一组非常特殊的签名标头 + JSON 正文。我真的很想卷曲它以进行调试和一般情况下的理智。
因此,我编写了一个小脚本,在给定主机名、路径和正文的情况下,执行所有修改,然后写出 cURL 命令行应该是什么。例如。
./sign example.com /api/v1/foo/bar '{"foo":"bar"}'
example.com/api/v1/foo/bar -H 'x-sign:XXXXX', -H ... --data-binary '{"foo":"bar","sign":"xxx"}'
(是的,看起来确实很复杂......)
我希望这可以很容易地进行 shell 处理(在 ZSH 中),因此:
curl -v $(./sign ...)
但这给了我各种各样的引用错误(或者尝试将标头内容卷曲为 URL,具体取决于我如何进行引用)。
唯一的工作方式感觉太笨重以至于不真实:
sh -c "curl -v $(./sign ...)"
我想我在这里错过了一些相当引用的选项。关于如何获得这个“好”的任何指示?
答案1
您./sign
输出 shell 代码,因此应该通过sh
您的sh -c
shell 或当前 shell对其进行评估eval
:
eval "curl -v $(sign...)"
您zsh
也可以仅解释其中的引用(不执行该 shell 代码可能执行的扩展):
curl -v "${(@Q)${(z)"$(sign)"}}"
where(z)
解释引号,并(Q)
删除引号(并且(@)
引号内保留空元素)。
如果sign
输出"foo bar" "$(echo test)"
,第一个将curl
使用foo bar
和test
作为参数进行调用,而第二个将使用curl
和foo bar
作为$(echo test)
参数进行调用。