linux 2>&1的用法

linux中有三种标准输入输出,分别是STDIN,STDOUT,STDERR,对应的数字是0,1,2。STDIN就是标准输入,默认从键盘读取信息;STDOUT是标准输出,默认将输出结果输出至终端,也就是显示器之类的东西;STDERR是标准的错误信息,默认也会显示在终端上。由于STDOUT与STDERR都会默认显示在终端上,为了区分二者的信息,就有了编号的0,1,2的定义,用1表示STDOUT,2表示STDERR。
下面举个例子:以rhce中的例子为例。
1、在系统中创建一个普通用户test;
2、以普通用户登录,或者以root登录 su -test 切换至普通用户test;
3、执行 find /etc -name passwd 命令,默认会将命令的执行结果(STDOUT)与错误信息(STDERR)都输出至终端显示器。
4、体验一下编号1,2的作用,find /etc -name passwd >find.out 2>find.err,这里会将STDOUT与STDERR分别存放至find.out和find.err中,该命令也可以写成下面三种形式,大家可以体会一下编号的意义。
find /etc -name passwd 1>find.out 2>find.err
find /etc -name passwd 2>find.err >find.out
find /etc -name passwd 2>find.err 1>find.out
我个人理解就是find /etc -name passwd的命令的执行结果输出正确的输出(STDOUT)被1接收,错误的信息(STDERR)被2接收。
5、若要将所有的输出及错误信息都显示出来,可以用&表示全部1和2的信息,例如:
find /etc -name passwd &>find.all
6、有时候希望将错误的信息重新定向到输出,就是将2的结果重定向至1中就有了"2>1"这样的思路,如果按照上面的写法,系统会默认将错误的信息(STDERR)2重定向到一个名字为1的文件中,而非所想的(STDOUT)中。因此需要加&进行区分。就有了 2>&1 这样的用法,举例:
find /etc -name passwd 2>&1 |less
7、有时候还能看到这样的用法:
find /etc -name passwd &2>&1 |less
这里可以分解成
find /etc -name passwd & 表示前面的命令放到后台执行。
2>&1 |less 表示将错误信息重定向至标准输出,并用less进行分页显示。

原文:http://blog.csdn.net/zhoubl668/article/details/27657201

这篇文章解释的更清楚:http://www.runoob.com/linux/linux-shell-io-redirections.html

==========================补充==================================

文件描述符及重定向:
文件描述符是与文件输入、输出相关联的整数。它们用来跟踪已打开的文件。最常见的文件描述符是stdin、stdout和stderr。我们甚至可以将某个文件描述符的内容重定向到另一个文件描述符中。
在编写脚本的时候会频繁使用标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。通过内容过滤将输出重定向到文件是我们平日里的基本任务之一。当命令输出文本 时,这些输出文本有可能是错误信息,也可能是正常的(非错误的)输出信息。单靠查看输出的文本本身,我们没法区分哪些是正常,哪些是错误。不过可以通过文件描述符来解决这个问题,将那些与特定描述符关联的文本提取出来。
文件描述符是与某个打开的文件或数据流相关联的整数。文件描述符0、1以及2是系统预留的。
 0 —— stdin(标准输入)。
 1 —— stdout(标准输出)。
 2 —— stderr(标准错误)。
(1) 用下面的方法可以将输出文本重定向或保存到一个文件中:
$ echo "This is a sample text 1" > temp.txt
这种方法通过截断文件的方式,将输出文本存储到文件temp.txt中,也就是说在把echo命令的输出写入文件之前,temp.txt中的内容首先会被清空。
(2) 将文本追加到目标文件中,看下面的例子:
$ echo "This is sample text 2" >> temp.txt
(3) 查看文件内容:
$ cat temp.txt
This is sample text 1
This is sample text 2
(4) 来看看什么是标准错误以及如何对它重定向。当命令输出错误信息时,stderr信息就会被打印出来。
$ ls +
ls: cannot access +: No such file or directory

这里,+是一个非法参数,因此将返回错误信息。
成功和不成功的命令:
当一个命令发生错误并退回时,它会返回一个非0的退出状态;而当命令成功完成后,它会返回数字0。退出状态可以从特殊变量$?中获得(在命令执行之后立刻运行echo $?,就可以打印出退出状态)。

下面的命令会将stderr文本打印到屏幕上,而不是文件中(而且因为并没有stdout的输出,所以out.txt没有内容):
$ ls + > out.txt
ls: cannot access +: No such file or directory

下面的命令中,我们将stderr重定向到out.txt:
$ ls + 2> out.txt #正常运行
你可以将stderr单独重定向到一个文件,将stdout重定向到另一个文件:
$ cmd 2>stderr.txt 1>stdout.txt
还可以利用下面这个更好的方法将stderr转换成stdout,使得stderr和stdout都被重定向到同一个文件中:
$ cmd 2>&1 output.txt
或者这样:
$ cmd &> output.txt    ---这三种方式用得多一些

原文地址:https://www.cnblogs.com/rusking/p/6888483.html