问题描述
我希望第一个命令以状态 0 退出而不打印任何内容。第二个命令的输出和状态应如图所示。有人能告诉我如何修改 jq_expr
来实现这一点吗? (应保留选项 -e
。)
$ jq_expr='.value | .[] | [.x] | @tsv'
$ jq -e -r "$jq_expr" <<< '{"value": []}' || echo "$?" # I just want this one to exit with 0 instead of 4.
4
$ jq -e -r "$jq_expr" <<< '{"value": [{"x":42}]}' || echo "$?"
42
解决方法
[这是对原始问题的回应,其中 jq 的第一次调用被赋予了准 JSON 值:{"value": [{x:1}]}
。]
表达式 {"value": [{x:1}]}
不是有效的 JSON,因此如果将其读取为有效的 JSON,则抑制错误消息的唯一方法是将其重定向到 /dev/null
。 (jq 的异常处理机制不能用于捕获此类语法错误。)
有多种工具(包括 jq 本身)可用于将此类准 JSON 字符串转换为 JSON,因此您可能希望利用其中的一种。例如,考虑:
$ jq -nc -f <(echo '{"value": [{x:1}]}')
{"value":[{"x":1}]}
,
要特别处理 .value 为空数组的情况,您可以使用 if ... then ... else ... end
语句、try ... catch ...
表达式或其他等效语句。
由于要求不太明确,我只是指出您可以删除 -e 要求并继续:
jq_expr='.value | if length > 0 then map(.x) else empty end | @tsv'
如果您真的想使用 -e 选项,根据您最近关于 SO 的问题之一,您可能必须使用 halt_error/1
。