下面两条命令分别会有怎样的输出
echo hello 1>&2 |grep aaa
echo hello 2>&1 |grep aaa
答:第一个输出hello,第二个无输出,解析如下
1>&2 将正确输出重定向到标准错误2通道
2>&1 将错误输出重定向到标准输出1通道
echo hello 1>&2 后面跟了一个 | grep aaa
| 是管道,意思就是将第一条指令的结果放到第二条指令中,管道命令右边只处理左边的标准正确输出,也就是通道1
echo hello 1>&2 将结果输出到错误2通道,也就是在终端屏幕上显示hello,而标准输出1通道没有值,| grep aaa 搜素左边传来的标准输出通道1的结果,发现没有aaa,所以没有输出,最终屏幕只显示一个hello
echo hello 2>&1 将错误返回值输出到标准1通道,不过该语句正确,没有错误,通道2也就为空,屏幕没有显示,| grep aaa 搜素左边传来的标准输出通道1的结果,通道1有hello 但是没有 aaa 所以没有输出,所以屏幕没有显示
再帮大家加深一下,如果换一下,改成 echo hello 1>&2 | grep e 和 echo hello 2>&1 | grep e 呢?
echo hello 1>&2 将正确结果hello输出到错误2通道,也就是在终端屏幕上显示hello,而标准输出1通道没有值,| grep aaa 搜素左边传来的标准输出通道1的结果,发现没有hello,所以没有输出,最终屏幕只显示一个hello
echo hello 2>&1 将错误返回值输出到标准1通道,不过该语句正确,没有错误,通道2也就为空,屏幕没有显示,| grep aaa 搜素左边传来的标准输出通道1的结果,发现有e,所以输出hello
通道2会在屏幕上显示,通道1不会在屏幕上显示,记住这句话,这句话是针对管道的第一个命令,大家别误解了,把管道命令左边命令的通道1的值给右边命令,右边命令再输出,如果正确,输出通道1,错误,输出通道2
这就是我对重定向 ,1>&2 , 2>&1 的理解,有什么不对的大家也可以提出来一起讨论
---------------------------------------------------------------------------------------------------------------------------------
shell上:
0表示标准输入
1表示标准输出
2表示标准错误输出
> 默认为标准输出重定向,与 1> 相同
2>&1 意思是把 标准错误输出 重定向到 标准输出.
有以下两种简写方式
&>log
>&log
&>file 意思是把 标准输出 和 标准错误输出 都重定向到文件file中
C.为什么2>&1要放在后面
考虑如下一条shell命令
nohup java -jar app.jar >log 2>&1 &
1
(最后一个&表示把条命令放到后台执行,不是本文重点,不懂的可以自行Google)
为什么2>&1一定要写到>log后面,才表示标准错误输出和标准输出都定向到log中?
几个基本符号及其含义:
/dev/null 表示空设备文件
0 表示stdin标准输入
1 表示stdout标准输出
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
从command>/dev/null说起1
其实这条命令是一个缩写版,对于一个重定向命令,肯定是command > a这种形式,它默认等于command 1>a,即将标准输出结果重定向到文件a中。所以command > /dev/null相当于执行了command 1 > /dev/null。执行command产生了标准输出stdout(用1表示),重定向到/dev/null的设备文件中。
说说2>&1
通过上面command > /dev/null等价于command 1 > /dev/null,那么对于2>&1也就好理解了,2就是标准错误,1是标准输出,那么这条命令不就是相当于把标准错误重定向到标准输出么。但是是&1而不是1,这里&是什么?这里&相当于等效于标准输出。
2>&1,意思是错误输出等同于标准输出。所以使得./test.sh >test.log,可以把标准输出和错误输出全部导入日志test.log里。
注意:2>&1,中间不能有空格。
注意:2>&1,必须写在最后,否则会失去原有意义。
————————————————