为什么通过I/O重定向读取和写入相同的文件会导致Unix中出现空文件?

Ven*_*oju 7 unix shell io-redirection

如果我将命令的输出重定向到它读取的同一文件,则其内容将被删除.

sed 's/abd/def/g' a.txt > a.txt
Run Code Online (Sandbox Code Playgroud)

有谁能解释为什么?

小智 16

重定向的第一件事是打开文件进行写入,从而清除任何现有内容.sed然后尝试读取你刚刚创建的这个空文件,什么都不做.然后关闭文件,不包含任何内容.


Jaa*_*koK 8

重定向操作<,>等被shell处理.当您向包含重定向的shell发出命令时,shell将首先打开该文件.如果>文件将被打开以进行写入,这意味着它将被截断为零大小.打开重定向文件后,shell将启动一个新进程,将其标准输入,输出和错误绑定到任何可能的重定向文件,然后才执行您提供的命令.因此,当sed您的示例中的命令开始执行时,a.txt已被shell截断.

顺便说一下,有点切线,这也是你不能直接使用重定向的原因,sudo因为它是需要权限来打开重定向文件的shell,而不是正在执行的命令.