http://www.4pang.com/2010/09/23/%E7%B2%BE%E5%BD%A9putty%E6%95%99%E7%A8%8B.html
重定向从命令提示符的错误消息: STDERR/STDOUT
本页
概要
将从一个应用程序使用的输出重定向时,">"符号还是打印到屏幕的错误消息。这是因为错误信息通常发送到标准输出流的而不是在标准错误流。
从控制台 (命令提示符) 应用程序或命令的输出通常发送到两个单独的流。在常规的输出发送到标准输出 (STDOUT) 和错误消息发送到标准错误 (STDERR)。重定向输出使用控制台时,">"符号,仅重定向 STDOUT。若要重定向的 STDERR 您必须指定"2 >"重定向符号。这将选择第二个是 STDERR 输出流。如果您将输出重定向到 NUL 设备使用"dir file.xxx > nul",仍可以看到该错误消息:若要重定向到 NUL 的错误消息,使用以下命令:或您可以将输出重定向到一个的位置和到另一个错误。可以通过将输出重定向到 STDOUT STDERR 为使用"& 1"命令,然后将输出从 STDOUT 发送到一个文件来打印错误和标准输出到一个文件中:
从控制台 (命令提示符) 应用程序或命令的输出通常发送到两个单独的流。在常规的输出发送到标准输出 (STDOUT) 和错误消息发送到标准错误 (STDERR)。重定向输出使用控制台时,">"符号,仅重定向 STDOUT。若要重定向的 STDERR 您必须指定"2 >"重定向符号。这将选择第二个是 STDERR 输出流。
示例
在命令"dir file.xxx"(其中不存在 file.xxx) 将显示以下输出:在驱动器 F 卷是糖果 Cane 卷序列号是 34EC 0876年
找不到的文件
找不到的文件
找不到的文件
dir file.xxx 2> nul
dir file.xxx > output.msg 2> output.err
dir file.xxx 1> output.msg 2>&1
如何将标准输出stdout和标准错误stderr重定向到文件输出
在shell脚本编写过程中执行如下命令
$./test.sh > test.log 2>&1
前半部分./test.sh > test.log很容易理解,那么后面的2>&1是怎么回事呢?这个就是我们标题的答案。接下来要解释这个问题,还是得提到文件重定向。我们知道>和<是文件重定向符。那么1和2是什么?在shell中,每个进程都和三个系统文件相关联:标准输入stdin,标准输出stdout和标准错误stderr,三个系统文件的文件描述符分别为0,1和2。所以这里2>&1 的意思就是将标准错误也输出到标准输出当中。下面通过一个例子来展示2>&1有什么作用:
$ cat test.sh
shdt
datetest.sh中包含两个命令,其中shdt是一个不存在的命令,执行会报错,默认情况下,错误会输出到stderr。date则能正确执行,并且输出时间信息,默认输出到stdout
$./test.sh > test.log
./test.sh: line 1: shdt: command not found$ less test.log
Wed Nov 28 09:50:09 2007可以看到,date的执行结果被重定向到log文件中了,而shdt无法执行的错误则只打印在屏幕上。
$ ./test.sh > test.log 2>&1$ less test.log
./test.sh: line 1: shdt: command not found
Wed Nov 28 09:50:09 2007这次,stderr和stdout的内容都被重定向到log文件中了。实际上, > 就相当于 1> 也就是重定向标准输出,不包括标准错误。通过2>&1,就将标准错误重定向到标准输出了,那么再使用>重定向就会将标准输出和标准错误信息一同重定向了。如果只想重定向标准错误到文件中,则可以使用2> file。