linux黑洞设备的路径,Linux中的黑洞(black hole)-/dev/null

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.

简单翻译:

在许多操作系统中, /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 的意思就是将标准错误也输出到标准输出当中。

数字0表示标准输入-stdin

数字1表示标准输出-stdout

数字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

2016年 01月 13日 星期三 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

2016年 01月 13日 星期三 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

2016年 01月 13日 星期三 23:42:18 CST

2 /dev/zero文件

3 后记

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值