我正在尝试更新一个简单的 JSON 文件(由一个具有多个键/值对的对象组成)并且我使用相同的命令但得到不同的结果(有时甚至使用第二个命令删除整个 json)。我正在尝试的命令是:
cat ~/Desktop/config.json | jq '.Option = "klay 10"' | tee ~/Desktop/config.json
该命令完美替换了
minerOptions 的值用“klay 10”键,我的预期输出。
然后,我尝试在新更新的文件上运行相同的过程(只是更改了那个键的值),并且只获得没有结果的交互式终端。
ps不幸的是,这对显示正在发生的事情没有帮助。这是我在获得第一个命令以完美更改键的值后所做的:
cat ~/Desktop/config.json | jq ‘.othOptions = "-epool etc-eu1.nanopool.org:14324 -ewal 0xc63c1e59c54ca935bd491ac68fe9a7f1139bdbc0 -mode 1"' | tee ~/Desktop/config.json
我原以为会取代
othOptions与分配结果的键值,就像上次一样。我尝试直接将标准输出发送到文件,但也没有结果。我什至尝试再管道一次并创建一个临时文件,然后将其移动到原始文件,所有这些,而不是相同的相同命令,只需返回
>绝对零输出;当我退出该过程时,它与以前的值相同,而不是新值。
我在这里遗漏了什么导致相同的命令只有不同的输入(第二个中的键紧跟在第一个之后并且具有相同的结构,它没有创建对象或任何东西,只是像第一个一样的键值对。我认为它可能是
tee 但任何其他实现,例如将标准输出传递到文件都会产生相同的常量
> 等待命令,没有用户。
在求助于 SE 之前,我真的在网上到处寻找为什么会发生这种情况,这让我很头疼,因为我认为应该很简单。
请您参考如下方法:
正如@GordonDavisson 指出的那样,使用 tee覆盖输入文件是(众所周知的 - 参见例如 jq FAQ )灾难的秘诀。如果您绝对肯定想要无条件地覆盖文件,那么您可能需要考虑使用 sponge ,如
jq ... config.json | sponge config.json
或更安全:
cp -p config.json config.json.bak && jq ... config.json | sponge config.json
有关此选项和其他选项的更多详细信息,请在常见问题解答中搜索“海绵”。




