为什么linux重定向会截断文件?

为什么linux重定向会截断文件?,linux,shell,command-line,Linux,Shell,Command Line,我有一个名为“test.txt”的文件,如下所示: hello world 它是,只是一个“hello world”字符串。如果我使用perl正则表达式: perl -pe "s/hello/bye/g" test.txt 它说: bye world 但如果我试图将该文件重定向到自身: perl -pe "s/hello/bye/g" test.txt > test.txt 结果文件为空。为什么?如何在文件上“过滤”正则表达式?重定向发生在shell解析命令行时。这种情况发生在实际

我有一个名为“test.txt”的文件,如下所示:

hello world
它是,只是一个“hello world”字符串。如果我使用perl正则表达式:

perl -pe "s/hello/bye/g" test.txt
它说:

bye world
但如果我试图将该文件重定向到自身:

perl -pe "s/hello/bye/g" test.txt > test.txt

结果文件为空。为什么?如何在文件上“过滤”正则表达式?

重定向发生在shell解析命令行时。这种情况发生在实际命令执行之前,因此,在您有机会读取重定向到的文件之前,它会被覆盖。

由于重定向,它会在应用程序有机会读取之前打开该文件进行写入。改为重定向到临时文件,然后在之后重命名。

perl
接受参数
-i
。有了这个,你可以用perl程序处理一个文件,并立即将其写回。

@Ivan,
-i
的参数只是备份的扩展名,因此你可以省略它或采取一些简单的措施,例如
~
.bak
。要澄清的是,打开文件进行写入的效果之一是文件被截断(它的大小更改为长度为零)因此在应用程序打开它时它是空的。