如果命令失败,如何让管道停止?

问题描述 投票:0回答:1

我正在使用此代码来使用 jq 就地格式化 json 文件

jq . foo.json | sponge foo.json

它工作得很好,但有一个致命的缺陷 - 如果

jq . foo.json
失败(例如,由于解析错误),管道只会继续滴答作响,并且不会向
foo.json
写入任何内容,从而擦除文件。我想要的行为是与
foo | bar
相同的行为,但是如果
foo
失败,
bar
将不会被执行。
set -o pipefail
看起来很有希望,但事实证明事实并非如此。这感觉像是一个足够常见的用例,会有一些巧妙的简写,但我无法弄清楚。

bash pipe
1个回答
0
投票

可以分享一下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将保持不变。

© www.soinside.com 2019 - 2024. All rights reserved.