重定向顺序

重定向顺序

我不太明白计算机如何读取这个命令。

cat file1 file2 1> file.txt 2>&1

如果我理解,2>&1只需将标准错误重定向到标准输出即可。

按照这个逻辑,该命令对我来说如下:

  1. 连接文件file1file2.

  2. stdout从此操作发送到file.txt.

  3. 发给。stderrstdout

  4. 结尾?

我不确定计算机在做什么。按照我的逻辑,命令应该是

cat file1 file2 2>&1 > file.txt

但这是不正确的。

答案1

我发现使用作业更容易想到。

  • >就好像=
  • &就好像$

你开始于

1 = /dev/tty
2 = /dev/tty

那么你的第一个例子1> file.txt 2>&1

1 = file.txt
2 = $1           # and currently $1 = file.txt

留给你

1 = file.txt
2 = file.txt

如果你用另一种方式做,你再次开始

1 = /dev/tty
2 = /dev/tty

那么2>&1 > file.txt

2 = $1           # and currently $1 = /dev/tty
1 = file.txt

所以最终结果是

1 = file.txt
2 = /dev/tty

并且您只重定向了stdout,而不是stderr

答案2

重定向的顺序很重要,应该阅读它们左到右

例如: command 2>&1 >somefile意思是:

  1. 2将名为(绑定到stderr)的描述符重定向到当前的1( )的目的地stdout,此时从左到右读就是终端。
  2. 然后将1( stdout) 更改为somefile,这是磁盘中的一个文件

因此,在这种情况下,stderr转到终端,然后stdout转到文件,这可能不是您想要的。

另一方面,command >somefile 2>&1意味着:

  1. 重定向stdoutsomefile
  2. 然后重定向到与( )stderr相同的目的地。stdoutsomefile

在最后一种情况下,stderrstdoutgo to somefile,这可能就是您想要的。

答案3

cat file1 file2 1> file.txt 2>&1

>&实际上意味着重复,它使用 dup 系统调用将新的文件描述符映射到已打开的文件上。

因此,您(实际上是 bash)必须先打开新的标准输出,然后说“并将标准错误重定向到当前设置的任何标准输出”。

答案4

该命令将命令的和cat file1 file2 > file.txt 2>&1发送到。现在,这仅在未找到 file1 或 file2 的情况下才有用,在这种情况下,显示“文件未找到”的错误消息将保存到 file.txt。stdoutstderrcatfile.txt

这与 相同cat file1 file2 &> file.txt

现在重定向的顺序很重要。以下不会将 cat 命令的 stderr 发送到 file.txt 而是发送到终端。

$ cat file1 file2 2>&1 > file.txt 

这是因为它首先将 stdout 的目的地复制到 stderr,但此阶段的 stdout 仍然指向终端。然后,您将 stdout 重定向到 file.txt,因此只有 stdout 会保存到 file.txt。错误消息仍会打印到屏幕上,并且不会保存到 file.txt 中。

相关内容