重定向顺序

iDo*_*ter 53 command-line shell bash io-redirection file-descriptors

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

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

但这不正确。

Mik*_*kel 74

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

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

你开始

1 = /dev/tty
2 = /dev/tty
Run Code Online (Sandbox Code Playgroud)

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

1 = file.txt
2 = $1           # and currently $1 = file.txt
Run Code Online (Sandbox Code Playgroud)

离开你

1 = file.txt
2 = file.txt
Run Code Online (Sandbox Code Playgroud)

如果你以另一种方式这样做,你再次开始

1 = /dev/tty
2 = /dev/tty
Run Code Online (Sandbox Code Playgroud)

然后2>&1 > file.txt

2 = $1           # and currently $1 = /dev/tty
1 = file.txt
Run Code Online (Sandbox Code Playgroud)

所以最终结果是

1 = file.txt
2 = /dev/tty
Run Code Online (Sandbox Code Playgroud)

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

  • 对于任何曾经在名为“1”或“2”的随机文件中找到过的人,您都会了解每个@Mikel的“2>1”和“2>&1”之间的区别。另外,我很欣赏这种心理翻译,它对我有用。`1>&2` 变成 `1 = $2`,在语法上“有点”意味着 bash、RegEx 和 Perl 中的某些东西。 (3认同)
  • 在像 `var=$othervar` 这样的赋值中,`$` 在右边引入了变量名。在像 `2>&1` 这样的重定向中,`&` 在右侧引入了文件描述符编号。我是说你可以把它想象成“文件 2 等于文件 1”。(但是有两种类型的等号:`<` 表示“用于读取”,而 `>` 表示“用于写入”。) (2认同)

Ame*_*ina 24

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

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

  1. 重定向命名描述符2(绑定到stderr)到当前的目的地1stdout),其在这一点上,读左-OT-右边是终端。
  2. 然后将1( stdout) 改为 go to somefile,这是磁盘中的一个文件

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

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

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

在最后一种情况下,stderr和 都stdout转到somefile,这可能是您想要的。


X T*_*ian 5

cat file1 file2 1> file.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

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

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