Linux中的黑洞(black hole)-/dev/null

转载请注明来源:http://blog.csdn.net/loongshawn/article/details/50514018

1 /dev/null文件

1.1 维基百科关于/dev/null说明

In some operating systems, the null device is a device file that discards all data written to it but reports that the write operation succeeded.

The null device is typically used for disposing of unwanted output streams of a process, or as a convenient empty file for input streams. This is usually done by redirection.

The /dev/null device is a special file, not a directory, so one cannot move a whole file or directory into it with the Unix mv command. The rm command is the proper way to delete files in Unix.

以上引自维基百科https://en.wikipedia.org/w/index.php?title=Null_device&redirect=no

简单翻译:

在许多操作系统中, /dev/null是一个空设备,是一个抛弃向该文件中写的所有数据并反馈写操作成功的设备文件。

/dev/null通常用来处理进程中那些不想要的输出流,或者作为一个方便的空文件给输入流。这个通过用来做重定向。

/dev/null设备是一个特殊的文件,而不是一个路径。因此不能通过mv命令来移动一个文件或路径进入这个设备文件,rm命令是Unix系统中删除文件适当的方法。

以上为本人拙劣的翻译,凑合看

1.2 /dev/null用法

既然定义中说了/dev/null是一个接收垃圾的文件(比喻),那完美要如何使用呢?

将之前还需要普及下Linux重定向和shell相关知识。

比如,我经常会执行这个命令:

nohup ./program >/dev/null 2>&1 &

上面命令中的>符号就是重定向符号。那么那个数字1和2是个啥玩意?

1.2.1 聊聊数字

在shell中,每个进程都和三个系统文件相关联:标准输入stdin,标准输出stdout和标准错误stderr,三个系统文件的文件描述符分别为0、1和2。所以这里2>&1 的意思就是将标准错误也输出到标准输出当中。

  1. 数字0表示标准输入-stdin
  2. 数字1表示标准输出-stdout
  3. 数字2表示标准错误-stderr

1.2.2 聊聊符号&

nohup ./program >/dev/null 2>&1 &

命令中有前后两个&,后面一个好理解,表示后台运行;前面一个可能理解困难一点,通过下面事例说明:

// stdout和stderr都直接送往文件a,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。
nohup ./program >a 2>a &

// stdout直接送往文件a,stderr是继承了FD1的管道之后,再被送往文件a,a文件只被打开一遍,就是FD1将其打开,效率更高
nohup ./program >a 2>&1 &

所以第一个&符号表示标准错误共用了标准输出的管道,提高IO效率。

1.2.3 回到黑洞/dev/null

nohup ./program >/dev/null 2>&1 &

上述命令就是表示标准输出和错误都不要,丢进黑洞,让他消失的无影无踪。

1.3 /dev/null测试

1.3.1 原始测试

有一个shell脚本如下,其中t会提示命令不存在,date输出当前日期:
test.sh

t
date

执行./test.sh的结果

[dddd@e100069205247.zmf /alidata/www/wwwroot/apps/test]
$./test.sh
./test.sh: line 1: t: command not found
20160113日 星期三 23:23:40 CST

错误提示输到标准输出。

1.3.2 标准输出到1.log

[dddd@e100069205247.zmf /alidata/www/wwwroot/apps/test]
$./test.sh >1.log
./test.sh: line 1: t: command not found

这时终端只输出了错误提示,标准输出重新定向到了1.log。

[dddd@e100069205247.zmf /alidata/www/wwwroot/apps/test]
$ls
1.log  test.sh

[dddd@e100069205247.zmf /alidata/www/wwwroot/apps/test]
$cat 1.log
20160113日 星期三 23:33:52 CST

1.3.3 标准输出和错误都输入到1.log

[dddd@e100069205247.zmf /alidata/www/wwwroot/apps/test]
$./test.sh >1.log 2>&1

这时终端啥都没有,标准输出和错误都重新定向到了1.log。

[dddd@e100069205247.zmf /alidata/www/wwwroot/apps/test]
$cat 1.log
./test.sh: line 1: t: command not found
20160113日 星期三 23:42:18 CST

2 /dev/zero文件

介绍参考文章《Linux中的特殊文件-/dev/zero》

3 后记

到这里相信大家已经对重定向有了一个新的了解,以后碰到这方面的问题,应该可以不用再去百度了。欢迎大家拍砖。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页