大家好,我是梁旭。众所周知,在Linux下,一切皆文件,设备文件也是如此。我们经常在工作的过程中看到/dev/null,那它是什么呢?从技术上讲,/dev/null是一个虚拟设备文件。就程序而言,这些虚拟设备文件将被视为真实文件。程序可以从这个数据源请求数据,结果数据将由操作系统提供。但是,这些数据并不是从磁盘中读取的,而是由操作系统动态生成的。虚拟设备文件的典型示例是/dev/zero。但是,当你要向/dev/null写入数据时,无论向/dev/null写入什么数据,最终都会被丢弃,就像被扔进黑洞一样。既然如此,/dev/null的真正用途是什么?要理解这个问题,首先要对Linux系统或者Unix和类Unix系统的标准输出和标准错误输出有一个基本的了解。标准输出文件和标准错误输出文件命令行程序可以生成两种类型的输出:标准输出和标准错误输出。标准输出记录到标准输出文件stdout,标准错误输出记录到标准错误输出文件stderr。默认情况下,标准输出和标准错误输出文件都与您的终端窗口(或控制台)相关联。这意味着发送到标准输出文件或标准错误输出文件的任何信息都将显示在您的屏幕上。但是,通过shell中的重定向,您可以更改此行为。例如,您可以将标准输出重定向到一个文件。这样,标准输出信息就不会显示在屏幕上,它会保存到那个文件中供你以后参考,或者你也可以将标准输出信息重定向到另一个物理设备,比如数字LED或液晶显示器。一些常用的重定向方法如下:使用2>可以重定向标准错误输出信息。例如:2>/dev/null或2>/home/user/error.log。使用1>可以重定向标准输出消息。使用&>可以同时重定向标准错误和标准输出。使用/dev/null清除不需要的输出由于输出有两种:标准输出和标准错误输出,所以/dev/null的第一个用途就是过滤掉一种输出。通过以下实际示例可以更容易地理解上面的这种用法。如果想通过在/sys文件夹下查找文件名中带电源字符串的文件来查找电源设置的文件,可以这样写命令:$grep-rpower/sys/因为目录下有很多文件/sys文件夹非root用户无法访问文件,会导致很多Permissiondenied错误,并输出到屏幕上。这些错误信息会把屏幕弄得乱七八糟,一些重要的信息也会被冲掉。由于Permissiondenied错误消息是标准错误输出的一部分,您可以将它们重定向到/dev/null。$grep-rpower/sys/2>/dev/null这样显示的信息会干净很多。有时候,我们可能不想看到标准输出的内容,而是想看到标准错误的内容,那么我们可以将标准输出重定向到/dev/null。$pingbaidu.com1>/dev/null上面的截图显示,在没有重定向输出的情况下,ping命令会在数据包到达目标主机时显示其正常输出。而对于第一个命令,当网络连接时,屏幕上没有任何显示,但是一旦与目标机器断开连接,屏幕上只会显示错误信息。当然,你也可以将标准输出和标准错误输出重定向到两个不同的文件。$pingbaidu.com1>/dev/null2>error.log本例中不显示标准输出信息,将错误信息保存到名为error.log的文件中。将所有输出重定向到/dev/null有时,我们可能不想看到任何输出,因此有两种方法可以做到这一点。$grep-rpower/sys/>/dev/null2>&1string>/dev/null表示将标准输出重定向到/dev/null,然后第二部分2>&1表示将标准错误重定向定向到标准输出文件。在这里,您必须将标准输出文件写为&1而不是简单的1。写入2>1只是将标准输出重定向到名为1的文件。这里需要注意的是,顺序也很重要。如果您将重定向参数切换为如下所示:$grep-rpower/sys/2>&1>/dev/null它不会像您预期的那样工作。这是因为一旦2>&1首先被解释器解释,标准错误输出将被重定向到默认的标准输出文件stdout并显示在屏幕上。然后,当标准输出被重定向到/dev/null时,标准输出信息将被清除。最终结果是您将看到错误消息显示在屏幕上。如果您忘记了正确的顺序,还有一个更简单的顺序:$grep-rpower/sys/&>/dev/null在此示例中,&>/dev/null相当于将stdout和stderr输出重定向到/dev/null.将输出重定向到/dev/null的其他实际示例如果您想知道您的磁盘读取串行数据的速度有多快,可以使用dd命令进行测试。但是dd命令要么输出到标准输出文件,要么指定输出到一个文件。为了排除写入数据对结果的影响,我们使用参数=/dev/null,这样dd的输出就可以写入这个虚拟文件,而不是真实的磁盘。在这里您甚至不需要使用shell重定向来完成它。对于下面的命令,参数if=指定输入的文件名;of=的参数指定输出的文件名,即输出写入的位置。像下面这样的测试并不十分精确,但足以说明问题。$ddif=debian-disk.qcow2of=/dev/nullstatus=progressbs=1Miflag=direct以上是一个实际的场景。再介绍一个场景。在某些情况下,您可能想知道从某个服务器下载内容的速度有多快。但是你不想向磁盘写入不需要的东西,所以这个时候,你可以把内容写入/dev/null。$wget-O/dev/nullhttp://ftp.halifax.rwth-aachen.de/ubuntu-releases/18.04/ubuntu-18.04.2-desktop-amd64.iso结语本文介绍几个/dev/null文件几个实际用法,希望对你的工作有所帮助。您知道这个特殊设备文件还有其他有趣的用途吗?留言告诉我吧!最后,最近有很多朋友找我要一份Linux学习路线图,所以我结合自己的经验,利用业余时间熬夜一个月,整理了一本电子书。无论你是面试还是自我提升,相信都会对你有所帮助!免费送给大家,只求大家给我点个赞!电子书|LinuxDevelopmentLearningRoadmap也希望有小伙伴可以和我一起把这本电子书做得更完美!获得?希望老铁们来个三连击,让更多人看到这篇文章。推荐阅读:干货|程序员和高级架构师免费发送工件的必备资源|支持搜索的资源网站
