我正在尝试在 bash 中运行一个命令,其中我有一个command 1
通过 stdin 接受大量内容,然后将该内容输出到 a 的命令file.txt
,但是,command 1
会生成一个内容流,并且显然file.txt
会在启动时立即创建command 1
,然后在command 1
完成后进行更新具有正确的输出。
echo 'a lot of content' | command 1 > file.txt
问题是我只想file.txt
在command 1
完全完成后创建或触摸。
有什么办法可以实现这一点吗?
编辑:
用例:我正在使用一个 Web 开发服务器,每次文件更改时都会刷新,因此我在真正更新文件之前会进行一些预处理。
上述命令的问题是,如果文件被更新或创建空内容,服务器会立即刷新,有一个空页面,所以我真的想等待后处理完成(假设需要大约 4 秒)并且然后触摸file.txt
才能正确呈现在页面上。
因此,我只需要在这里运行一个命令,即更新command 1
后,我的 Web 开发服务器将自动刷新。file.txt
答案1
sponge
从 GNU使用moreutils
:
echo 'a lot of content' | command 1 | sponge file.txt
或者使用临时文件。
答案2
最简单的解决方案可能sponge
是@heemayl 建议。或者,你可以这样做:
command > tmpfile && mv tmpfile watched_file
这将导致command
将其输出保存在 中tmpfile
,只有在命令退出并且成功退出后,该输出才会被重命名为watched_file
(服务器设置为监视的文件)。要在失败时重命名它,请使用:
command > tmpfile; mv tmpfile watched_file