为什么将输出重定向到 2>&1 和 1>&2?

Pea*_*key 41 linux redirection

我遇到过几个使用2>&1and 的命令1>&2,但是我完全搞不清楚使用它的目的以及何时应该使用它。

我的理解

我知道这1代表标准输出并2代表标准错误。我知道这2>&1结合了2to的输出,1反之亦然。

我没有得到的

  1. 我应该什么时候使用它?
  2. 它的目的是什么?

use*_*686 42

有时你想将 stdoutstderr重定向到同一个位置,这>&是使用的时候——它将一个文件描述符指向另一个。


例如,如果要将 stdout 和 stderr 都写入同一个文件(无论是它/dev/null还是output.txt),则可以分别重定向它们,使用

app 1>/dev/null 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

或者您可以将一个文件描述符重定向到该文件,并将另一个文件描述符重定向到第一个:

app 1>/dev/null 2>&1

app 2>/dev/null 1>&2
Run Code Online (Sandbox Code Playgroud)

在第一个示例中,将2>&1文件描述符 #2 指向 #1 已经指向的位置。第二个示例实现了相同的功能,只是从 stderr 开始。

再举一个例子,在某些情况下,stdout(文件描述符 #1)已经指向所需的位置,但您不能通过名称来引用它(它可能与管道、套接字等相关联)。这在使用进程扩展(` `$( )运算符)时经常发生,它通常只捕获 stdout,但您可能希望在其中包含 stderr。在这种情况下,您还可以使用>&将 stderr 指向 stdout:

out=$(app 2>&1)
Run Code Online (Sandbox Code Playgroud)

另一个常见的例子是寻呼机,或grep,或类似的实用程序,因为管道|通常只在标准输出上工作,你可以在使用管道之前将标准错误重定向到标准输出:

app 2>&1 | grep hello
Run Code Online (Sandbox Code Playgroud)

如何知道哪个2>&1或哪个1>&2是正确的?在已经建立的文件描述符去的权利>&,并且希望重定向文件描述符转到左边。(2>&1意思是“将文件描述符 #2 指向文件描述符 #1”。)


一些 shell 有常见重定向的快捷方式;以下是来自 Bash 的示例:

  • 1> 可以缩短为 >

  • 1>foo 2>&1>&foo&>foo

  • 2>&1 | program|& program

  • 每次从左到右将每个文件描述符重定向一个,并按该顺序应用这些规则。如果您*首先*将标准输出定向到文件,*然后* 将标准输出重定向到标准输出我们现在指向的位置,那么标准输出和标准输出将转到同一个文件。如果你交换了这两个重定向,那么你会得到不同的结果(将 stderr 重定向到 stdout *now* 的位置,然后将 stdout 移动到另一个文件,而 stderr 继续指向它所指向的位置)。 (2认同)

soa*_*dos 1

2:适用于当您的输出来自标准错误和标准输出,并且您希望将它们组合成单个字符串时。

1:当您想要操作标准错误和标准输出的输出时。