必知Linux 2>&1

1 基本符号及其含义
/dev/null 表示空设备文件
0 表示stdin标准输入
1 表示stdout标准输出
2 表示stderr标准错误

2 command>/dev/null
其实这条命令是缩写的,command > /dev/null 即 command 1 > /dev/null。执行command产生了标准输出stdout(用1表示),重定向到/dev/null的设备文件中。

3 理解2>&1
2就是标准错误,1是标准输出,这条命令是把标准错误重定向到标准输出。这里&相当于等效于标准输出。

command>a 2>a 与 command>a 2>&1的区别

通过上面分析,对于command>a 2>&1这条命令,等价于command 1>a 2>&1可以理解为执行command产生的标准输入重定向到文件a中,标准错误也重定向到文件a中。那么是否就说command 1>a 2>&1等价于command 1>a 2>a呢。其实不是,command 1>a 2>&1与command 1>a 2>a还是有区别的,区别就在于前者只打开一次文件a,后者会打开文件两次,并导致stdout被stderr覆盖。&1的含义就可以理解为用标准输出的引用,引用的就是重定向标准输出产生打开的a。从IO效率上来讲,command 1>a 2>&1比command 1>a 2>a的效率更高。

4 举个栗子

//test.sh
\#!/bin/sh
abc
date

其中abc指令并不存在,执行会报错,会输出到stderr。date能正常执行,执行会输出当前时间,会输出到stdout。

执行命令sh test.sh>res.log 2>&1结果为,生成res.log文件

stdout.sh: line 1: //test.sh: No such file or directory
stdout.sh: line 5: abc: command not found
Mon Feb 26 22:56:32 CST 2018

stdout和stderr都被重定向到了res.log中。上面我们未对stderr也就是2说明如何输出(默认是屏幕),stderr就输出到了屏幕上,不仅对stdout重定向到res.log中,对标准错误重定向到res.log的引用,即 res.log的文件描述符中。

你可能感兴趣的:(linux)