如何在 shell 中使用 < 和 > 覆盖同一个文件?

如何在 shell 中使用 < 和 > 覆盖同一个文件?

当我这样做时my_script < filename.txt > filename.txt,文件将被覆盖并截断。

Unix 命令行上是否有某种方法可以指定重定向不是同时完成,即输入完成后才开始输出?

我正在尝试编写一个实用程序来读取文件,并根据命令行选项重新生成并覆盖它。我意识到我可以在程序中添加支持不是使用 stdin/stdout,但我喜欢重定向的灵活性和便利性。

答案1

你可以这样做:

(rm -f foo && yourprogram > foo) < foo

例如:

(rm -f foo && wc > foo) < foo

它打开foo供阅读。然后它启动一个子 shell,并删除 i 节点,foo同时保持文件打开。最后它打开foo输出,从而创建foo.

它需要对目录的写权限,因此如果您只有对文件的写权限,那么您就不走运了。

它会改变 i-node(因此权限、所有者、ctime 都会丢失),但如果只有名称重要,应该没问题。

与此相反sponge,即使 的输出yourprogram大于内存,也可以工作。

答案2

可以将文件读入此处的字符串缓冲区,然后覆盖同一文件(shell bash):

my_script <<<$(<filename.txt) >filename.txt

相关内容