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

大家好,我是良许 。
大家知道,在 linux 下,一切皆文件,对于设备文件也是如此 。我们在工作的过程中,经常会看到 /dev/null 这个玩意,那它到底是什么呢?
专业地讲,/dev/null 是一个虚拟设备文件 。而对程序而言,这些虚拟设备文件则会被当成真实的文件对待 。程序可以向这种数据源请求数据,所得到的数据将由操作系统提供 。但是,这些数据并不是从磁盘上读取到的,而是由操作系统动态生成的 。虚拟设备文件的一个典型例子就是 /dev/zero。
然而,当你想向 /dev/null 写入数据时,无论你向 /dev/null 中写入什么数据,最终都会被丢弃,就像被丢入黑洞一样 。
既然如此,那么 /dev/null 到底有什么用?要理解这个问题,你首先必须要对 Linux 系统或者 Unix 以及类 Unix 系统的标准输出以及标准错误输出有基本的了解 。
标准输出文件与标准错误输出文件一个命令行程序可以生成两种类型的输出:标准输出与标准错误输出 。标准输出会被记录到标准输出文件 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 错误,并被输出到屏幕上 。
Linux系统中虚拟设备文件的各种实用用法

文章插图
 
这些错误信息会使得屏幕变得杂乱不堪,一些重要的信息都会被冲刷不见了 。而由于 Permission denied 错误信息是属于标准错误输出的一部分,所以你可以将它们重定向到 /dev/null。
$ grep -r power /sys/ 2>/dev/null
Linux系统中虚拟设备文件的各种实用用法

文章插图
 
这样,显示出来的信息就干净清爽很多了 。
有时候,我们可能不想看标准输出的内容,相反,想要看标准错误的内容,那么我们就可以将标准输出重定向到 /dev/null。
【Linux系统中虚拟设备文件的各种实用用法】$ ping baidu.com 1>/dev/null
Linux系统中虚拟设备文件的各种实用用法

文章插图
 
上面的截图显示,若没有重定向输出,当数据包可以到达目标主机时,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 的文件中 。
这里要着重注意的一点是,顺序也是很重要的 。如果你将重定向的参数调换位置成以下这样:


推荐阅读