当我这样做时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