调用命令,其中一个参数是对文件进行分类的结果

调用命令,其中一个参数是对文件进行分类的结果

如何调用带有 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/ esshell 中,语法为`cmdor `{more complex cmd}。虽然在 Fish 中它只是(...),但现在较新的版本也支持$(cmd)(也可以在双引号内使用)。

sh-like shell 中,当未加引号且在列表上下文中时, $(cmd), like$username会受到 split+glob(仅在 zsh 中拆分)的影响,因此如果您希望将其作为一个参数传递,则应加引号。

有关详细信息$(<file),请参阅了解 Bash 的读取文件命令替换

相关内容