如何调用带有 on 参数的命令作为 cat'ing 文件的结果?
npx aws-api-gateway-cli-test \
--username $username \
--password $password \
--method $method \
--body cat user.json | jq # <--------- how am I supposed to write this?
上面的代码片段会导致解析错误
另一种尝试:
npx aws-api-gateway-cli-test \
--username $username \
--password $password \
--method $method \
--body ${cat user.json | jq}
错误:替换错误
以下作品可供参考:
npx aws-api-gateway-cli-test \
--username $username \
--password $password \
--method $method \
--body \{\"test\": \"123\"\}
答案1
npx aws-api-gateway-cli-test \
--username "$username" \
--password "$password" \
--method "$method" \
--body "$(cat user.json)"
尽管在 ksh、zsh 或 bash 中,您也可以执行以下操作:
npx aws-api-gateway-cli-test \
--username "$username" \
--password "$password" \
--method "$method" \
--body "$(<user.json)"
$(cmd...)
cmd
,称为命令替换,扩展为删除尾随换行符的输出,并且在bash
删除所有 NUL 字节的情况下。对于不应该包含 NUL 的 JSON 来说这很好(无论如何,外部命令的参数不能包含 NUL),并且 JSON 数据中包含换行符的尾随空格并不重要。
命令替换的特定语法来自 80 年代初期的 ksh,并已sh
在 90 年代初由 POSIX 标准化,因此受到所有类似 POSIX 的 shell 的支持。
该功能本身起源于 70 年代末的 Bourne shell,但使用了繁琐的`cmd`
语法。(t)csh
然后也使用该语法。在rc
/ es
shell 中,语法为`cmd
or `{more complex cmd}
。虽然在 Fish 中它只是(...)
,但现在较新的版本也支持$(cmd)
(也可以在双引号内使用)。
在sh
-like shell 中,当未加引号且在列表上下文中时, $(cmd)
, like$username
会受到 split+glob(仅在 zsh 中拆分)的影响,因此如果您希望将其作为一个参数传递,则应加引号。
有关详细信息$(<file)
,请参阅了解 Bash 的读取文件命令替换