Linux shell中的2>&1

本文详细解析了Shell中重定向的原理与应用,重点讲解了标准输出(stdout)与标准错误(stderr)的区别,以及如何使用>和2>&1进行重定向,使输出更符合需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 /dev/null 2>&1

shell中可能经常能看到:echo log > /dev/null 2>&1

  • 命令的结果可以通过%>的形式来定义输出
    /dev/null :代表空设备文件
    > :代表重定向到哪里,例如:echo “123” > /home/123.txt
    1 :表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
    2 :表示stderr标准错误
    & :表示等同于的意思,2>&1,表示2的输出重定向等同于1

  • 1 > /dev/null 2>&1 语句含义:
    1 > /dev/null: 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
    2>&1:接着,标准错误输出重定向(等同于)标准输出,这里标准输出已经重定向到了 /dev/null。那么标准错误也会输出到空设备文件。
    可以把/dev/null 可以看作"黑洞". 它等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到.
    偶尔也可以把 & 在命令的最后加上,表示让程序后台执行。

2 2>&1

经常可以在一些脚本,尤其是在crontab调用时发现这个形式的命令调用:/tmp/test.sh > /tmp/test.log 2>&1
前半部分/tmp/test.sh > /tmp/test.log很容易理解,那么后面的2>&1是怎么回事呢?
要解释这个问题,还是得提到文件重定向。我们知道>和<是文件重定向符。那么1和2是什么?
在shell中,每个进程都和三个系统文件 相关联:标准输入stdin,标准输出stdout、标准错误stderr,三个系统文件的文件描述符分别为0,1、2。所以这里2>&1 的意思就是将标准错误也输出到标准输出当中。

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

$ cat test.sh
t
date

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

./test.sh > test1.log
./test.sh: line 1: t: command not found

$ cat test1.log
Wed Jul 10 21:12:02 CST 2013

可以看到,date的执行结果被重定向到log文件中了,而t无法执行的错误则只打印在屏幕上。

$ ./test.sh > test2.log 2>&1

$ cat test2.log
./test.sh: line 1: t: command not found
Tue Aug 5 20:53:44 CST 2019

这次,stderr和stdout的内容都被重定向到log文件中了。

实际上, > 就相当于 1> 也就是重定向标准输出,不包括标准错误。通过2>&1,就将标准错误重定向到标准输出了,那么再使用>重定向就会将标准输出和标准错误信息一同重定向了。如果只想重定向标准错误到文件中,则可以使用2> file。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值