当我们在服务器中执行命令或启动服务时,经常能看到这样一段命令
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
echo "Hello" > output.txt
这会将 Hello 写入 output.txt 文件,覆盖原有内容。
2>
和1>
1>
: 将标准输出(stdout)重定向到文件。1 是标准输出的文件描述符。2>
: 将标准错误(stderr)重定向到文件。2 是标准错误的文件描述符。例如
1
command > stdout.txt 2> stderr.txt
这会将命令的标准输出写入 stdout.txt,标准错误写入 stderr.txt。
&
&
在这里表示“文件描述符”或“流”。当与数字结合时,& 表示引用某个文件描述符。
三、2>&1
2>&1
的具体含义:
2
: 表示标准错误(stderr)的文件描述符。
>
: 重定向操作符。
&1
: 表示标准输出(stdout)的文件描述符。& 表示引用文件描述符 1。
因此,2>&1
的意思是:将标准错误(stderr)重定向到标准输出(stdout)的目标。换句话说,2>&1
会将标准错误输出到和标准输出相同的地方。
四、应用示例
合并标准输出和标准错误到同一个文件
假设我们有一个命令 my_command,它可能会产生正常的输出和错误信息。我们希望将所有的输出(包括正常输出和错误信息)都写入同一个文件 output.txt。则我们可以用这样的命令:
1
my_command > output.txt 2>&1
丢弃所有输出
如果我们不关心任何输出(无论是正常输出还是错误信息),可以将它们都重定向到
/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 |