本帖最后由 周易 于 2023-10-8 22:53 编辑
以下以Bash 为例,我们假定文件名为w1 。需要注意的是,不同Shell可能有不同的实现方式。
Redirections are processed in the order they appear, from left to right.
因此不是优先级问题。
我们首先明确一点:重定向是怎么实现的。
实现输入重定向(STDIN_FILENO = 0 )的伪代码如下。
fd = openat(AT_FDCWD, "w1", O_RDONLY);
dup2(fd, STDIN_FILENO);
close(fd);
实现输出重定向(STDOUT_FILENO = 1 )的伪代码如下。
fd = openat(AT_FDCWD, "w1", O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fd, STDOUT_FILENO);
close(fd);
这些都是在执行cat 之前依次发生的。
对于以下两种方式:
- cat < w1 > w1
- cat > w1 < w1
区别只在于执行伪代码两者的顺序不同。
不难发现,如果指定了输出重定向,则在打开文件过程中w1 的内容将会被清空。
O_TRUNC
If the file already exists and is a regular file and the access mode allows writing (i.e., is O_RDWR or O_WRONLY ) it will be truncated to length 0.
|