shell的/dev/null
1. 文件描述符
执行shell命令时,会默认打开3个文件:
类型— 文件描述符— 默认情况— 对应文件句柄位置
标准输入(standard input) 0 从键盘获得输入 /proc/slef/fd/0
标准输出(standard output) 1 输出到屏幕(即控制台) /proc/slef/fd/1
错误输出(error output) 2 输出到屏幕(即控制台) /proc/slef/fd/2
平时在执行shell命令中,都默认是从键盘获得输入,并且将结果输出到控制台上,错误输出一般也是控制台。
3. 重定向
command >filename 把标准输出重定向到新文件中
command 1>filename 同上 , 1就是标准输出
command >>filename 把标准输出追加到文件中
command 1>>filename 同上 , 1就是标准输出
command 2>filename 把标准错误重定向到新文件中
command 2>>filename 把标准错误追加到新文件中
符号的左边表示文件描述符,如果没有的话表示1,也就是标准输出,符号的右边可以是一个文件,也可以是一个输出设备。
当使用>时,会判断右边的文件存不存在,如果存在的话就先删除,然后创建一个新的文件,不存在的话则直接创建。
5. 空
/dev/null,或称空设备,是一个特殊的设备文件,大黑洞, 它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF。
/dev/null 被称为位桶(bit bucket)或者黑洞(black hole)。空设备通常被用于丢弃不需要的输出流,或作为用于输入流的空文件。这些操作通常由重定向完成。
把/dev/null看作”黑洞”。它等价于一个只写文件,并且所有写入它的内容都会永远丢失,而尝试从它那儿读取内容则什么也读不到。
然而, /dev/null对命令行和脚本都非常的有用。
7. 重定向绑定
来看 >/dev/null 2>&1 &
7.1 >/dev/null
将标准输出1重定向到/dev/null中, 1忽略了, 默认的是1.
执行了>/dev/null之后,标准输出就会不再存在,没有任何地方能够找到输出的内容。
7.2 2>&1
这条是重定向绑定,采用&将两个输出绑定在一起。
这条命令作用是错误输出将和标准输出同用一个文件描述符,就是错误输出将会2和标准输出1输出到同一个地方。
这个其实是三个部分组成的:2, >&, 1 ,&> 表示把符号左边的内容以符号右边的形式输出。
比较下2>1, 2代表错误输出, >是重定向,1则是一个名为1无后缀的普通文件,所以就是把错误重定向到一个文件1。
7.3 >/dev/null 2>&1
执行shell命令之前,会确定好所有的输入输出位置,并且从左到右依次执行重定向的命令.
上述命令:
首先是让标准输出1重定向到/dev/null中,丢弃标准输出
然后错误输出2重用了标准输出1的描述符,所以错误输出2也被定向到了/dev/null中,错误输出同样也被丢弃了。
执行了这条命令之后,该条shell命令将不会输出任何信息到控制台,也不会有任何信息输出到文件中。
7.4 还有个不同
>/dev/null 2>&1 和 >/dev/null 2>/dev/null基本差不多, 不同在于指向文件时候会有抢占。例如:
ls a.txt >out 2>&1,正常。
ls a.txt >out 2>out,乱码。 out文件被竞争。
问题是因为shell从左到右依次执行重定向的命令。
7.5 这是后台
>/dev/null 2>&1 &
最后一个& , 是让该命令在后台执行。
发表评论
Want to join the discussion?Feel free to contribute!