相信大家经常在程序中遇到 >/dev/null 2>&1语句,这边做详细地解读
1、/dev/null 表示Linux的空设备文件,可将其等价与一个只写文件,所有写入它的内容都会永远丢失,什么也读取不到
2、其中2,1都属于文件表述符
0:表示标准输入 ,默认情况从键盘获得输入,对应文件句柄位置/proc/self/fd/0
1:表示标准输出,默认情况输出到屏幕(即控制台),对应文件句柄位置/proc/self/fd/1
2:表示错误输出,默认情况输出到屏幕(即控制台),对应文件句柄位置/proc/self/fd/2
3、shell重定向介绍(参考:https://www.cnblogs.com/ultranms/p/9353157.html)
在shell命令中,默认是从键盘获得输入,并将结果输出到控制台上,程序可以通过输入输出重定向处理外部的输入,然后将运算结果输出到指定位置,在程序运行的过程中,会有些关键性的信息,比如异常堆栈,外部接口调用情况等,这些都会统统写到日志文件里
(输出重定向)
">"(右尖括号)在unix/linux shell中表示输入到的意思,就是将">"左边的内容输入到">"右边
基本一些命令如下:
command > filename 将标准输出重定向到新文件中
command 1>filename 将标准输出重定向到新文件中
command >> filename 将标准输出追加到文件中
command1 >> filename 将标准输出追加到文件中
command 2 > filename 将标准错误定向到新文件中
command2 >> filename 将标准错误追加到文件中
当使用">"时,会判断右边文件存不存在,如果存在就先删除,然后创建新文件 ;当使用”>>“进行追加时,则不会删除原来已经存在的文件
eg:创建测试目录,目录下只有文件A
(1)ls A B =>会报error 无法访问B,没有文件或者目录,,同时也会列出A
(2)ls A B >out 2>err =>表示标准输出到out中,标准错误输出到err中
(输入重定向)
”<“(左尖括号)对输入做重定向,如果符号的左边没有写值,那么默认为0,一些基本指令如下:
command < filename 以filename作为标准输入
command 0< filename 同上
command << delimiter 从标准输入中读入,直到遇到delimiter分隔符
eg:假设文件input值为aaa
(1)cat > out <input => 则out的内容就是input文件中的内容
(2)cat > out <<end => 输入完敲下回车后,命令没有结束,等待输入数据,直到我们敲end之后,cat命令才会结束
4、高级用法 重定向绑定
2>&1 这条命令就是用了重定向绑定,采用&将两个输出绑定到一起,将错误输出和标准输出到同一个地方
(1)>/dev/null 2>&1 与 >/dev/null 2>/dev/null 这样写会导致标准输出和错误输出抢占资源。可能导致文件内容覆盖,缺失等情况
(2)>/dev/null 2>&1 与 2>&1 >/dev/null 错误输出开始会跟标准默认输出一样输出到屏幕上,后来标准输出又定向到/dev/null中
nobup command & 启动一些后台服务
nobup command >/dev/null 2>&1 &