你能解释一下为什么吗:
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
在打开文件期间的内容将被清除。