我希望第一个命令以状态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