当前位置: 首页 > 科技观察

Shell脚本中-Dev-Null的用途

时间:2023-03-11 22:13:05 科技观察

本文转载自微信公众号《Linux开发那些事》,作者LinuxThings。转载此文请联系Linux开发那些事公众号./dev/null是一个特殊的设备文件,它会丢弃所有写入其中的数据。把它想象成一个黑洞,它相当于一个只写文件,所有写入其中的东西都会消失,尝试从中读取或输出都不会有结果。同样,/dev/null在命令行和脚本中都很有用。使用/dev/null通常用于丢弃不需要的输出流,或用作输入流的空文件。这些操作通常是通过重定向来完成的,任何你想丢弃的数据都可以写入其中并丢弃标准输出。在写shell脚本的时候,只想通过命令的结果来执行后面的逻辑,不想在命令执行过程中有大量的中间结果输出。这时候就可以将命令执行过程中的输入全部写入/dev/null中已有的a.sh脚本中。它的作用是判断传入的系统命令是否存在。脚本内容如下#!/bin/bashcommand-v$1if[[$?-eq0]];thenecho"command$1exist..."elseecho"command$1notexist..."fiexecute./a.shtop命令,输出结果如下[tt@ecs-centos-7dev_test]$。/a.shtop/bin/topcommandtopexist...说明:command-v命令名是查找指定命令名的命令是否存在,存在则输出指定命令名的路径,否则不输出什么$?表示上一个命令脚本的执行结果,0表示成功,其他表示失败。脚本的执行结果先输出top命令的路径,再输出top命令存在的日志。将command-v$1的结果重定向到/dev/null,屏蔽top命令路径的输出,调整后的a.sh内容如下#!/bin/bashcommand-v$1>/dev/nullif[[$?-eq0]];thenecho"command$1exist..."elseecho"command$1notexist..."fi再次执行./a.shtop,结果如下[tt@ecs-centos-7dev_test]$。/a.shtopcommandtopexist...[tt@ecs-centos-7dev_test]$从执行结果可以看出,将command-v$1的中间结果重定向到在/dev/null之后,top命令的路径将不再输出。而且,修改后的脚本执行结果与原来的结果一样,标准错误输出被丢弃。在shell脚本中,删除文件时,需要先对文件进行判断。如果存在,则可以进行删除操作,否则,删除时会输出错误。一般的删除文件脚本内容如下:#!/bin/bashif[-f$1];那么rm$1fi可以将删除命令的输出重定向到/dev/null,避免输出错误信息,同时此时不需要判断文件是否存在,调整后删除的脚本内容如下:#!/bin/bashrm$1>/dev/null2>$1分别执行命令。/d.sht1.txt,./d.sht2.txt,结果如下:[tt@ecs-centos-7dev_test]$lst*.txtt1.txt[tt@ecs-centos-7dev_test]$./d.sht1.txt[tt@ecs-centos-7dev_test]$./d.sht2.txt[tt@ecs-centos-7dev_test]$lst*.txtls:无法访问t*.txt:没有那个文件或目录ls:无法访问t*.txt:没有这样的文件或目录。t1.txt文件在当前目录下,t2.txt不存在。从执行结果可以看出,无论删除现有文件还是删除不存在的文件,都不会有错误输出。清空文件内容清空文件内容的方法有很多种。下面是使用/dev/null清除文件内容的方法。具体例子如下:[tt@ecs-centos-7dev_test]$catt.txt123456[tt@ecs-centos-7dev_test]$cat/dev/null>t.txt[tt@ecs-centos-7dev_test]$catt.txt日志处理在脚本中,为了方便调试,往往会加入一些日志打印逻辑,有时候这种调试日志比较多,脚本测试通过后,这些调试日志可能会被删除或者注释掉这里是个小技巧,既不删除也不注释掉日志,脚本执行的时候就不会输出这些调试日志了。例如:当前目录下有一个日志文件log.txt,脚本的调试日志会以echo"thisisdebuglog">>log.txt的形式写入到这个文件中既然脚本功能测试已经通过,调试日志就不用写到log.txt中了。可以这样做:原脚本不变,删除本地的log.txt,然后执行命令ln-s/dev/null./log.txt,该命令建立log.txt到/dev/null的软连接,而写入log.txt的内容以后实际上会写入/dev/null,所有写入/dev/null的内容都会被丢弃丢失