重定向顺序


29

我不太了解计算机如何读取此命令。

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

但这是不正确的。

Answers:


46

我发现使用分配更容易。

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

您从开始

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


我有点类推,但令人困惑-代表什么$
Eliran Malka

在类似的分配中var=$othervar$在右侧介绍变量名称。在类似的重定向中2>&1&在右侧引入文件描述符号。我想说的是,您可以将其视为“文件2等于文件1”。(但是有两种类型的等于:<表示“用于阅读”和>表示“用于写作”。)
Mikel

12

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

例如: command 2>&1 >somefile表示:

  1. 重定向stderr(即2)到的当前目的地stdout(此时为终端)。
  2. 然后stdout转到somefile

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

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

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

在后一种情况下都stderrstdoutsomefile,这可能是你想要的。


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

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

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


这太棒了!我一直在想这个&。您能否附上对该语法的一些引用,或者-更好的是-在上述dup系统上提供一些好的资源?
Eliran Malka

1
“ man dup”记录了系统调用。
X田

有道理:) thanx
Eliran Malka
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.