为什么 catting 符号链接文件并将输出重定向到原始文件会使后一个文件为空?

Ted*_*y C 10 symlink

以下是重现它的方法:

echo 'the original file' > orig
ln -s orig symb # now symb is symlinked to orig
cat symb > orig # this makes orig an EMPTY FILE, but why?
Run Code Online (Sandbox Code Playgroud)

orig 在第三个命令之后变成一个空文件,但为什么呢?

Phi*_*ing 30

当您尝试打开文件时会评估符号链接。在“正常”情况下,打开符号链接的结果是打开它引用的文件。所以:

ln -s original_file my_symlink
cat my_symlink > original_file
Run Code Online (Sandbox Code Playgroud)

非常类似于:

cat original_file > original_file
Run Code Online (Sandbox Code Playgroud)

为什么它会破坏内容?

在任何shellcommand > some_file会先打开并截断(零)some_file然后执行command,将结果写到some_file

因此,如果您cat x > x然后外壳将打开并截断x然后 cat x将打开并读取截断的文件,并写入所有零字节。