基础
0:表示标准输入stdin
1:表示标准输出stdout,系统默认为1,可省略(即1>/dev/null等价于>/dev/null)
2:表示标准错误stderr
>:表示重定向(即将输出定向到指定路径文件,>/dev/null表示将标准输出重定向到空设备文件,即不输出任何信息到终端,即不显示任何信息。)
2>&1:其中的&表示等同于的意思,即2(标准错误stderr)的重定向等同于1
cmd 1>a 2>a 和cmd 1>a 2>&1的区别
-
cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。
-
cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD(File Descriptor)1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开。
个人感觉有点C++中指针的意思(换汤不换药)
两者的不同点在于:
-
cmd >a 2>a 相当于使用了FD1、FD2两个互相竞争使用文件 a 的管道;
-
cmd >a 2>&1 只使用了一个管道FD1,但已经包括了stdout和stderr。
从IO效率上来讲,cmd >a 2>&1的效率更高。
2&>1实际用途(即错误的输出被合并)
-
清理系统邮件日志(比如crontab处理)
cmd >/dev/null 2&>1 其中0表示键盘输入1表示屏幕输出2表示错误输出,把标准出错重定向到标准输出,然后扔到/dev/null(代表空设备文件)下面去。
-
将标准错误stderr与stdout一同显示出来
./test.sh > test2.log 2>&1