Pingfan's Blog

理解linux命令 - 2>&1

字数统计: 647阅读时长: 2 min
2018/11/07 Share

最新遇到过几次类似2>&1这种命令,例如ls foo > /dev/null 2>&1, 本文解释一下其原理。

I/O重定向(redirection)

重定向就是将一条命令的输出重定向到其他位置,例如,我们使用cat来查看一下文件,它的输出被打印到屏幕上:

$ cat foo.txt
foo
bar
baz

我们可以将这个输出重定向到其他地方,例如output.txt

$ cat foo.txt > output.txt

$ cat output.txt
foo
bar
baz

第一条cat命令执行完后,我们没有在屏幕上看到输出,因为我们将标准输出(stdout)重定向到一个文件里,它不再输出到默认的屏幕。

除了标准输出外,还有一个位置叫叫标准错误(stderr),程序可以将错误信息输出到这里,例如,我们访问一个不存在的文件:

$ cat nop.txt > output.txt
cat: nop.txt: No such file or directory

即使我们将stdout重定向到一个文件中,我们依然看到了屏幕中出现了这行错误提示cat: nop.txt: No such file or directory,因为我们重定向的是标准输出,而不是标准错误

文件描述符(file descriptors)

文件描述符是用整数来表示一个打开的文件,如果你有100个打开的文件,你就有100个文件供述符。对于标准输出(stdout)和标准错误(stderr),都有对应的文件供述符。1代表stdout2代表stderr

两者结合

回到第一个例子,当我们将输出重定向到output.txt,我们可以这样:

$ cat foo.txt 1> output.txt

这个1stdout的文件描述符,重定向的语法是[FILE_DESCRIPTOR]>

所以,为了重定向stderr,需要加上对应文件描述符:

# Using stderr file descriptor (2) to redirect the errors to a file
$ cat nop.txt 2> error.txt

$ cat error.txt
cat: nop.txt: No such file or directory

到现在,你可能已经知道2>&1究竟是在干蛤了。

使用&1代表stdout的值,所以2>&1是“将stderr重定向到和stdout相同的位置”。即将stdoutstderr重定向到一个地方:

$ cat foo.txt > output.txt 2>&1

$ cat output.txt
foo
bar
baz

$ cat nop.txt > output.txt 2>&1

$ cat output.txt
cat: nop.txt: No such file or directory

总结:

  • command > outputcommand 1> output的缩写。
  • 可以使用&[FILE_DESCRIPTOR]来表示文件描述符的值。
  • 使用2>&1可以将stderr重定向到和stdout相同的位置(1>&2正好相反)

原文

https://www.brianstorti.com/understanding-shell-script-idiom-redirect/

CATALOG
  1. 1. I/O重定向(redirection)
  2. 2. 文件描述符(file descriptors)
  3. 3. 两者结合
  4. 4. 总结: