为什么在输入/输出重定向到同一个文件时该文件会被清空?

为什么在输入/输出重定向到同一个文件时该文件会被清空?

这个问题看上去很简单,但目前我还没能给出一个合理的解释。假设我用它tr来转换一些随机文本(可以是任何程序),并想将结果输出到原始文件中。

a@MacBook-Pro:~/Downloads$ cat test_file 
this is a sample text
a@MacBook-Pro:~/Downloads$ tr 't' 'T' <test_file >test_file 
a@MacBook-Pro:~/Downloads$ cat test_file #prints nothing

是否有任何特定规则/事物告诉我们不能同时将输入和输出重定向到同一文件?我显然知道我可以将输出重定向到新文件,然后复制结果,但我对这种行为非常好奇。

附言我一直在使用 Macbook,但在这种情况下这应该不重要

答案1

>test_file

截断文件。然后读取一个空白文件并且不向其中写入任何内容。

sponge如果您不想创建新文件则使用。

tr 't' 'T' <test_file | sponge test_file 

超级用户也给出了一个很好的答案来解决这个问题:为什么将文件输出重定向至其自身会产生一个空白文件?

PS:我假设您在 Mac 上运行 Ubuntu。

相关内容