我经常发现自己将一系列 shell 命令串在一起,最终目的是替换文件的内容。但是,使用>
时,它会打开原始文件进行写入,因此您会丢失所有内容。
由于缺乏更好的术语,是否有一个"惰性评估"版本的>
会等到之前的所有命令都执行完毕,然后再打开文件进行写入?
目前我正在使用:
somecommand file.txt | ... | ... > tmp.txt && rm file.txt && mv tmp.txt file.txt
这很丑陋。
sponge
在这里会有所帮助:
(引自手册页)
名字 海绵 - 吸收标准输入并写入文件
概要 塞德"..."文件 |格雷普 "..." |海绵文件
描述 Sponge 读取标准输入并将其写出到指定的文件中。 与外壳重定向不同,海绵在打开之前吸收了所有输入 输出文件。这允许构造从和读取的管道 写入同一文件。
It also creates the output file atomically by renaming a temp file into place, and preserves the permissions of the output file if it already exists. If the output file is a special file or symlink, the data will be written to it. If no output file is specified, sponge outputs to stdout.
另请参阅:我可以在 Linux 中读取和写入同一文件而不覆盖它 unix.SE 吗?