linux 下的两个特殊的文件 /dev/null 和 /dev/zero

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wudinaniya/article/details/87444356

一  /dev/null  

在类 Unix系统中, /dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功;若使用$?,会返回0,即命令执行成功)。

$?

最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)

在程序员行话,尤其是Unix行话中,/dev/null 被称为位桶(bit bucket)或者黑洞(black hole)空设备通常被用于丢弃不需要的输出流,或作为用于输入流的空文件。当你读它的时候,它会提供无限的空字符(NULL,ASCII NUL,0x00)。

其中的一个典型用法是cat $filename 会输出filename 对应的文件内容(输出到标准输出)
而使用  cat $filename > /dev/null   则不会得到任何信息,因为我们将本来该通过标准输出显示的文件信息重定向到了 /dev/null 中。
而使用  cat $filename 1>/dev/null  也会得到同样的效果,因为默认重定向的1就是标准输出。 (补充: 重定向的1 可以省略,意为标准输出,重定向的2 是标准错误输出)

我们使用 cat $filename 时如果filename 对应的文件不存在,系统肯定会报错:
"cat: filename: 没有那个文件或目录"

[root@zabbix-server ~]# ls 
anaconda-ks.cfg  a.txt
[root@zabbix-server ~]# cat aaa.txt
cat: aaa.txt: No such file or directory

如果我们不想看到错误输出呢?我们可以将错误输出写入到 2> 后面的空设备即 /dev/null  中。(2>/dev/null  “>”号前后不能有空格

[root@zabbix-server ~]# ls 
anaconda-ks.cfg  a.txt
[root@zabbix-server ~]# cat aaa.txt
cat: aaa.txt: No such file or directory
[root@zabbix-server ~]# cat aaa.txt 2>/dev/null

对比:

总结:

1  cat $filename  2>/dev/null   这条指令中  >  前面 2 是什么意思?
命令会有一个错误输出信息(包括错误提示,警告信息等)  ,2> 会把这个错误输出信息写入到 2> 后面的文件中。 对于上面这条指令即为 将  cat $filename 命令的 错误输出信息 写入到 /dev/null 中。
2  重定向 1 (1可以省略不写),重定向的是标准输出stdout, 重定向 2 重定向的是标准错误输出stderr。

[root@zabbix-server ~]# cat a.txt 
123456
[root@zabbix-server ~]# cat a.txt 2>/dev/null
123456
[root@zabbix-server ~]# cat a.txt >/dev/null
[root@zabbix-server ~]# cat a.txt 1>/dev/null
[root@zabbix-server ~]# 

3 有时候,我并不想看到任何输出,我只想看到这条命令运行是不是正常,那么我们可以同时禁止标准输出stdout和标准错误输出stderr,比如:

cat $filename 2>/dev/null  >/dev/null
如果 $filename 不存在,将不会有任何错误信息提示,
如果 $filename 存在,文件的内容将不会被打印到标准输出,
因此,上面的代码根本不会输出任何信息,当只想测试命令的退出码而不想有任何输出时非常有用(注意:使用 echo $? 查看上条命令的退出码:0为命令正常执行,1-255为有出错)

再比如:

[root@mysql-slave ~]# mysql -uroot -psdbrk -e "show slave status\G" 2>/dev/null >/dev/null
[root@mysql-slave ~]# 

我遇到过的问题:

我们在使用mysql5.6及mysql5.7或更高版本时,当执行下面这条信息时会报警告:在命令行界面写密码不安全

[root@mysql-slave ~]# mysql -uroot -psdbrk -e "show slave status\G" | grep "Running" | grep -c "Yes"
mysql: [Warning] Using a password on the command line interface can be insecure.
1

如果使用zabbix监控mysql主从同步状态的话,将上面这条命令配置在zabbix-agentd.conf中,在zabbix-server端获取 其对应的item key值会报错:

zabbix-agentd.conf 配置 UserParameter

UserParameter=mysql.replication,mysql -uroot -psdbrk -e "show slave status\G" | grep "Running" | grep -c "Yes"

zabbix-server端 获取 mysql.replication的值时,报错

报错原因:这里报这种错误是因为返回的结果集中有字符串警告信息,而后台zabbix的item的是numeric所以存储不进去报错

如果改成下面这样的命令将警告信息写入到黑洞中就不会报错了:

UserParameter=mysql.replication,mysql -uroot -psdbrk -e "show slave status\G" 2>/dev/null | grep "Running" | grep -c "Yes"

zabbix-server端 获取mysql.replication的值时,不再报错

对比:

[root@mysql-slave ~]# mysql -uroot -psdbrk -e "show slave status\G" | grep "Running" | grep -c "Yes"
mysql: [Warning] Using a password on the command line interface can be insecure.
1
[root@mysql-slave ~]# mysql -uroot -psdbrk -e "show slave status\G" 2>/dev/null | grep "Running" | grep -c "Yes"
1
[root@mysql-slave ~]# 

echo > a.txt    和  cat /dev/null >a.txt   的区别:

echo > a.txt    

[root@zabbix-server ~]# cat a.txt 
123456
[root@zabbix-server ~]# echo > a.txt
[root@zabbix-server ~]# cat a.txt 

[root@zabbix-server ~]# 

而 cat /dev/null > a.txt

[root@zabbix-server ~]# echo 123 > a.txt
[root@zabbix-server ~]# cat a.txt 
123
[root@zabbix-server ~]# cat /dev/null > a.txt 
[root@zabbix-server ~]# cat a.txt 
[root@zabbix-server ~]# 

二  /dev/zero

像 /dev/null 一样, /dev/zero也是一个伪文件。

/dev/null  它实际上产生连续不断的null的流(二进制的零流,而不是ASCII型的)。写入它的输出会丢失不见。
/dev/zero  主要的用处是用来创建一个指定长度,用于初始化的空文件,像临时交换文件,常和 dd 命令配合使用,见我的另一篇博客:linux 内存

猜你喜欢

转载自blog.csdn.net/wudinaniya/article/details/87444356
今日推荐