输出重定向只使用jq生成空文件



我遇到了一个有趣的问题。我使用jq来缩小批处理脚本中的JSON,我希望它能替换它读取的文件。虽然可能有更好的解决方案,但这虽然应该在纸面上有效,但在实践中却不起作用。

作品:

for /R %%f in (*.json) do (
ECHO Minifying JSON file "%%f"
(ECHO Hello) 1> "%%f"
)

输出文件:

Hello

显示重定向有效

for /R %%f in (*.json) do (
ECHO Minifying JSON file "%%f"
("pathtojq" . --unbuffered --compact-output "%%f" && ECHO Hello) 1> "%%f"
)

输出文件:

Hello

显示jq产生输出

for /R %%f in (*.json) do (
ECHO Minifying JSON file "%%f"
"pathtojq" . --unbuffered --compact-output "%%f"
)

CMD窗口中的输出:每个JSON文件的内容,缩小(就像我想要的那样)


我正在尝试做什么

for /R %%f in (*.json) do (
ECHO Minifying JSON file "%%f"
("pathtojq" . --unbuffered --compact-output "%%f") 1> "%%f"
)

输出文件:

正如您所看到的,不存在任何JSON,无论是缩小的还是其他的。


关于答案

@peak使用PowerShell提供了一个解决方法。在我的情况下,我得出了以下结论:

$ brew install jq sponge

这将输出正确的缩小JSON。我在这里所做的是调用PowerShell来处理缩小,并使用Set-Content cmdlet。

您不能覆盖正在读取的文件,因为第一个操作是通过重定向(重新)创建文件,然后jq将从空文件中读取。

只需重定向到一个临时文件,并在完成后替换原始文件。

即使它有效或看起来有效,使用输出重定向盲目覆盖输入文件通常也是个坏主意,甚至更糟。

在一个环境中海绵实用程序是可用的,它可以使用,但看起来你可能没有那么奢侈,所以你可能想考虑使用临时文件的更普通的方法。

PowerShell用户可以使用SetContent:https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-content?view=powershell-5.1

sponge回购在下有一个关于这方面的常见问题解答

:如何可以"就位";是否可以完成JSON文件的编辑?

这说明

。。。不建议使用tee或输出重定向(>)来覆盖输入文件,即使它看起来有效。

建议使用apt中的moreutils。在macOS上,可以进行

$ jq . my.json | sponge my.json

可以类似地使用CCD_ 6和CCD_。

使用CCD_8,json文件的就地格式将是

PD_10

最新更新