将非空文件 cat-ing 到其自身会使其变为空。为什么?

将非空文件 cat-ing 到其自身会使其变为空。为什么?

你能解释一下为什么吗:

cat < file.txt > file.txt

使file.txt空?

在 Linux 中的 Bash 中可以观察到这种情况。

答案1

因为它在读取数据之前打开并截断文件 — — 它是 shell,所以重定向甚至在启动之前就由 shell 处理cat

答案2

重定向>首先发生并打开file.txt写入,从而清除所有现有内容。

答案3

以下是 的示例Bash,其中我们假设文件名为file.txt。请注意,不同的 shell 可能有不同的实现。

重定向按照其出现的顺序从左到右进行处理。

所以这并不是因为“先发生”而引起的。

实现的伪代码STDIN_FILENO = 0如下

fd = openat(AT_FDCWD, "file.txt", O_RDONLY);
dup2(fd, STDIN_FILENO);
close(fd);

实现的伪代码STDIN_FILENO = 1如下

fd = openat(AT_FDCWD, "file.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fd, STDOUT_FILENO);
close(fd);

这些在cat执行之前按顺序发生。

对于以下两种方式:

  • cat < file > file
    
  • cat > file < file
    

区别仅在于命令其中伪代码执行两者。

删除
如果文件已经存在并且是常规文件,且访问模式允许写入(即 O_RDWR 或 O_WRONLY),则它将被截断为长度 0。

毫不奇怪,如果指定输出重定向,则file.txt在打开文件期间的内容将被清除。

相关内容