shell 中的>文件重定向符 和 标准输入、输出、错误以及 2&1 的含义*

1.问:其中 的2>&1是怎么回事?

. test.sh > test.log 2>&1

2.答:>和<是 文件重定向符。

在shell中,每个进程都和三个系统文件相关联:

  • 标准输入stdin,文件描述符为0
  • 标准输出stdout,文件描述符为1
  • 标准错误stderr,文件描述符为2

所以这里2>&1的意思就是将标准错误也输出到标准输出当中。

3.示例

下面通过一个例子来展示2>&1有什么作用:

1,准备一个脚本test.sh,内容如下:

t
date

test.sh中包含两个命令,其中t是一个不存在的命令,执行会报错,默认情况下,错误会输出到stderr。date则能正确执行,并且

输出时间信息,默认输出到stdout.

2,执行比较

命令
终端打印
文件内容 注释
. test.sh
t:未找到命令
2016年 11月 08日 星期二 13:31:07 CST
无输出 无文件
. test.sh > test.log
t:未找到命令
2016年 11月 08日 星期二 13:34:32 CST

可以看到,date的执行结果被重定向到log文件中了,

而t无法执行的错误则只打印在屏幕上。

. test.sh > test2.log 2>&1  无输出 t:未找到命令
2016年 11月 08日 星期二 13:45:56 CST
这次,stderr和stdout的内容都被重定向到log文件中了。

实际上, > 就相当于 1> 也就是重定向标准输出,不包括标准错误。通过2>&1,就将标准错误重定向到标准输出了(stderr已作为

stdout的副本),那么再使用>重定向就会将标准输出和标准错误信息一同重定向了。如果只想重定向标准错误到文件中,则可以使

用2> file。

那么如何将标准错误输出重定向到一个文件的同时在屏幕上也显示?

    [root@home root]# id fdfd 2>&1 |tee logfile
    id: fdfd: No such user
    [root@home root]# cat logfile
    id: fdfd: No such user

管道的用途是把进程的标准输出连接到另一个进程的标准输入,2>&1是把标准错误作为标准输出的副本。在楼顶那个命令里,把标

准输出和标准错误都输出作为tee命令的标准输入,tee的用途是把标准输入的副本拷贝到文件,并输出。不要混淆管道与重定向,

这是两个不同的概念。

 

posted @ 2016-11-08 10:50  f9q  阅读(450)  评论(0编辑  收藏  举报