0%

2>&1

当我们在服务器中执行命令或启动服务时,经常能看到这样一段命令 2>&1,这其实是在 Unix/Linux shell 中常见的重定向操作符,用于控制命令的输出流。

2>&1

当我们在服务器中执行命令或启动服务时,经常能看到这样一段命令 2>&1,这其实是在 Unix/Linux shell 中常见的重定向操作符,用于控制命令的输出流。为了理解它的含义,我们需要先了解 Unix/Linux 系统中的标准输入、标准输出和标准错误的概念。

一、标准输入、标准输出和标准错误

在 Unix/Linux 系统中,每个进程都有三个默认的文件描述符(File Descriptors),它们分别是:

  • 标准输入(stdin) : 文件描述符为 0,通常用于从用户或文件读取输入。
  • 标准输出(stdout) : 文件描述符为 1,通常用于输出正常的结果或信息。
  • 标准错误(stderr) : 文件描述符为 2,通常用于输出错误信息或警告。

默认情况下,标准输出(stdout)和标准错误(stderr)都会显示在终端上。但它们是两个独立的流,可以分别进行重定向。

二、重定向操作符

  1. >>>

    >: 将输出重定向到文件,覆盖文件内容。

    >>: 将输出重定向到文件,追加到文件末尾。

    例如

    1
    echo "Hello" > output.txt

    这会将 Hello 写入 output.txt 文件,覆盖原有内容。

  2. 2>1>

    1>: 将标准输出(stdout)重定向到文件。1 是标准输出的文件描述符。

    2>: 将标准错误(stderr)重定向到文件。2 是标准错误的文件描述符。

    例如

    1
    command > stdout.txt 2> stderr.txt

    这会将命令的标准输出写入 stdout.txt,标准错误写入 stderr.txt。

  3. &

    & 在这里表示“文件描述符”或“流”。当与数字结合时,& 表示引用某个文件描述符。

三、2>&1

2>&1 的具体含义:

2 : 表示标准错误(stderr)的文件描述符。

> : 重定向操作符。

&1 : 表示标准输出(stdout)的文件描述符。& 表示引用文件描述符 1。

因此,2>&1 的意思是:将标准错误(stderr)重定向到标准输出(stdout)的目标。换句话说,2>&1 会将标准错误输出到和标准输出相同的地方。

四、应用示例

  1. 合并标准输出和标准错误到同一个文件

    假设我们有一个命令 my_command,它可能会产生正常的输出和错误信息。我们希望将所有的输出(包括正常输出和错误信息)都写入同一个文件 output.txt。则我们可以用这样的命令:

    1
    my_command > output.txt 2>&1
  2. 丢弃所有输出

    如果我们不关心任何输出(无论是正常输出还是错误信息),可以将它们都重定向到 /dev/null(一个特殊的设备文件,用于丢弃数据)。

    1
    my_command > /dev/null 2>&1

五、注意事项

&> 的简化形式 : 在某些 shell(如 Bash)中,&> file> file 2>&1 的简写形式。例如:

1
my_command &> output.txt

等价于

1
my_command > output.txt 2>&1
---------------The End---------------