我正在使用此代码来使用 jq 就地格式化 json 文件
jq . foo.json | sponge foo.json
它工作得很好,但有一个致命的缺陷 - 如果
jq . foo.json
失败(例如,由于解析错误),管道只会继续滴答作响,并且不会向 foo.json
写入任何内容,从而擦除文件。我想要的行为是与foo | bar
相同的行为,但是如果foo
失败,bar
将不会被执行。 set -o pipefail
看起来很有希望,但事实证明事实并非如此。这感觉像是一个足够常见的用例,会有一些巧妙的简写,但我无法弄清楚。
可以分享一下json文件吗?
你可以试试这个。
jq . foo.json > temp.json && mv temp.json foo.json
这将首先运行 jq 。 foo.json > temp.json。
如果 jq 成功,它将把 temp.json 移动到 foo.json,并用格式化的 JSON 覆盖它。
如果jq失败,temp.json不会更新,foo.json将保持不变。