Linux系统中虚拟设备文件的各类实用用法

你们好,我是良许。程序员

你们知道,在 Linux 下,一切皆文件,对于设备文件也是如此。咱们在工做的过程当中,常常会看到 /dev/null 这个玩意,那它究竟是什么呢?面试

专业地讲,/dev/null 是一个虚拟设备文件。而对程序而言,这些虚拟设备文件则会被当成真实的文件对待。程序能够向这种数据源请求数据,所获得的数据将由操做系统提供。可是,这些数据并非从磁盘上读取到的,而是由操做系统动态生成的。虚拟设备文件的一个典型例子就是 /dev/zeroubuntu

然而,当你想向 /dev/null 写入数据时,不管你向 /dev/null 中写入什么数据,最终都会被丢弃,就像被丢入黑洞同样。服务器

既然如此,那么 /dev/null 到底有什么用?要理解这个问题,你首先必需要对 Linux 系统或者 Unix 以及类 Unix 系统的标准输出以及标准错误输出有基本的了解。markdown

标准输出文件与标准错误输出文件

一个命令行程序能够生成两种类型的输出:标准输出与标准错误输出。标准输出会被记录到标准输出文件 stdout ,而标准错误输出会被记录到标准错误输出文件 stderr 。网络

默认状况下,标准输出文件与标准错误输出文件都与你的终端窗口相关联(或者控制台)。这就意味着任何被输送到标准输出文件或标准错误输出文件的信息都会被显示在你的屏幕上。架构

可是,经过 Shell 中的重定向,你就能够改变这个行为。好比,你能够将标准输出重定向到一个文件中。这样,标准输出信息就不会显示在屏幕上,它将会被保存到那个文件中以便你之后查阅,或者你也能够将标准输出信息重定向到另外一个物理设备上,好比一个数字 LED 或者 LCD 显示器。学习

一些经常使用的重定向方式有以下:测试

  • 使用 2> 你能够重定向标准错误输出信息。例如:2>/dev/null 或者 2>/home/user/error.log
  • 使用 1> 你能够重定向标准输出信息。
  • 使用 &> 你能够同时重定向标准错误输出信息与标准输出信息。

利用/dev/null来清除没必要要的输出

因为存在两种类型的输出:标准输出与标准错误输出,因此 /dev/null 的第一个用途就是过滤掉其中一种类型的输出。经过下面实际的例子能够更容易地理解以上这个用途。网站

假如你想经过找 /sys 文件夹下文件名带 power 字符串的文件以此来找到关于电源设置的文件,你能够这么写命令:

$ grep -r power /sys/复制代码

因为 /sys 文件夹下存在不少非 root 用户没法访问的文件,这样就会形成不少 Permission denied 错误,并被输出到屏幕上。

这些错误信息会使得屏幕变得杂乱不堪,一些重要的信息都会被冲刷不见了。而因为 Permission denied 错误信息是属于标准错误输出的一部分,因此你能够将它们重定向到 /dev/null

$ grep -r power /sys/ 2>/dev/null复制代码

这样,显示出来的信息就干净清爽不少了。

有时候,咱们可能不想看标准输出的内容,相反,想要看标准错误的内容,那么咱们就能够将标准输出重定向到 /dev/null

$ ping baidu.com 1>/dev/null复制代码

上面的截图显示,若没有重定向输出,当数据包能够到达目标主机时,ping 指令会显示它的正常输出。而第一个命令,当网络是连通的时候屏幕什么也没显示,可是一旦它与目标机器断开链接,屏幕就只显示了错误信息。 固然了,你也能够将标准输出与标准错误输出重定向到两个不一样的文件。

$ ping baidu.com 1>/dev/null 2>error.log复制代码

在这个例子中,标准输出信息就不会被显示,而错误信息将会被保存到名为 error.log 的文件中。

重定向全部输出到/dev/null

有时候,咱们可能都不想看任何输出,那么有两种方法能够作到这点。

$ grep -r power /sys/ >/dev/null 2>&1复制代码

字符串 >/dev/null 表明 将标准输出重定向到 /dev/null 中 ,而后第二部分,2>&1,表明将标准错误重定向到标准输出文件中。这里你必须将标准输出文件写成 &1 ,而不是简单地写成 1 。写成 2>1 这样只会将标准输出重定向到一个名为 1 的文件中。

这里要着重注意的一点是,顺序也是很重要的。若是你将重定向的参数调换位置成如下这样:

$ grep -r power /sys/ 2>&1 >/dev/null复制代码

它就不是按你预期的那样执行了。那是由于一旦 2>&1 先被解释器解释了,标准错误输出就会被重定向到默认的标准输出文件 stdout 而且显示在屏幕上。而接下来,当标准输出被重定向到 /dev/null 时,标准输出信息就会被清除。最终的结果就是你将会看到错误信息显示在屏幕上。若是你忘记了正确的顺序,还有一个更简单:

$ grep -r power /sys/ &>/dev/null复制代码

在这个例子中,&>/dev/null 就等效于 重定向标准输出与标准错误输出到 /dev/null

其余将输出重定向到/dev/null实用例子

假如你想知道你的磁盘读取序列数据的速度到底有多快,你可使用 dd 命令来作测试。可是 dd 指令要么就是输出到标准输出文件,要么就是指定输出到一个文件中。为了排除写入数据对结果的影响,咱们使用参数 of=/dev/null ,这样就可使 dd 输出写入到这个虚拟文件中,而不是真正的磁盘里。这里你甚至都不须要用 Shell 的重定向就能够作到这点。

对于下面这条命令,参数 if= 指定用于输入的文件名;参数 of= 指定用于输出的文件名,即指定将输出写入到哪里。

如下这样的测试并非十分精确,但也足够说明问题了。

$ dd if=debian-disk.qcow2 of=/dev/null status=progress bs=1M iflag=direct复制代码

markdown

以上是一个实用场景。下面再介绍一个场景。

在某些状况下,你可能会想知道你从某一个服务器上下载东西的速度有多快。可是你又不想向磁盘写入没必要要的东西,那么这个时候,你就能够把内容写入到 /dev/null 里。

$ wget -O /dev/null http://ftp.halifax.rwth-aachen.de/ubuntu-releases/18.04/ubuntu-18.04.2-desktop-amd64.iso复制代码

结论

本文介绍几种 /dev/null 文件的几种实用用法,但愿对你的工做有帮助。你还知道这个特殊设备文件的其它有趣的用途吗?留言告诉我呗!


最后,最近不少小伙伴找我要Linux学习路线图,因而我根据本身的经验,利用业余时间熬夜肝了一个月,整理了一份电子书。不管你是面试仍是自我提高,相信都会对你有帮助!目录以下:

免费送给你们,只求你们金指给我点个赞!

电子书 | Linux开发学习路线图

也但愿有小伙伴能加入我,把这份电子书作得更完美!

有收获?但愿老铁们来个三连击,给更多的人看到这篇文章

推荐阅读:

相关文章
相关标签/搜索