大家好,我是良许。

大家知道,在 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 错误,并被输出到屏幕上。

这些错误信息会使得屏幕变得杂乱不堪,一些重要的信息都会被冲刷不见了。而由于 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

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

在某些情况下,你可能会想知道你从某一个服务器上下载东西的速度有多快。但是你又不想向磁盘写入不必要的东西,那么这个时候,你就可以把内容写入到 /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系统中虚拟设备文件的各种实用用法的更多相关文章

  1. linux系统中的文件权限详解(转)

    一.在<Linux系统中如何查看文件属性>中介绍了通过ls指令来查看文件的属性,具体如下: [命令] letuknowit@ubuntu:/$ cd /tmp letuknowit@ubu ...

  2. rpm 系 linux 系统中 repo 文件中的 $release 到底等于多少?

    rpm 系 linux 系统中 repo 文件中的 $release 到底等于多少? 结论 对于 8 来说,通过以下命令 #/usr/libexec/platform-python -c 'impor ...

  3. linux系统中,文件的三种特殊权限

    背景介绍 在linux系统中,我们熟知有rwx三种权限,对应所有者,同组用户,其他用户三种用户的权限,一共9个位来指定一个文件的权限情况,通过chmod xxx 来更改权限属性,其中xxx是已八进制表 ...

  4. linux(八)linux系统中查找文件二

    前面介绍的是find命令,我们发现一个find命令居然有那么多的命令,我看到都要晕了,不管没有关系,加油.相信自己! 一.grep命令 1.1.作用 Linux系统中grep命令是一种强大的文本搜索工 ...

  5. 三、Linux系统中的文件类型和文件扩展名

    .sock文件也是一类特殊的文件,这类文件通常用在网络之间进行数据连接,如:我们可以启动一个程序来监听客户端的要求,客户端可以通过套接字来进行通信: linux中的文件类型 文件类型介绍 Linux系 ...

  6. linux(七)之linux系统中查找文件

    前面介绍一篇文章介绍了关于vi编辑器的使用,感觉是不是那么多的命令怎么记得住呀,小编也是这样让认为的,但是慢慢的发现,其实还是很有意思的.正所谓熟能生巧多练习,找到其中的规律就ok了.今天看到一句话让 ...

  7. 浅谈linux系统中pdf文件的默认打开方式

    atril.gimp和evince,三者均可以打开application/pdf格式文件.gimp为一款图像处理软件:atril为mate环境下常用的文档查看器:evince为gnome环境下常用的文 ...

  8. 使用Gnupg对Linux系统中的文件进行加密

    GnuPG(GNU Privacy Guard或GPG)是一个以GNU通用公共许可证释出的开放源码用于加密或签名的软件,可用来取代PGP.大多数gpg软件仅支持命令行方式,一般人较难掌握.由于gpg软 ...

  9. linux系统中删除文件夹

    rm -rf 文件夹的名称 rm-r 文件名称

随机推荐

  1. Vue3 新特性

    一.vue3 为什么要重写 两个主要原因考虑重写vue新版本主要功能: 1.主流浏览器对新的JavaScript语言特性的普遍支持. 2.当前Vue代码库随着时间的推移而暴露出来的设计和体系架构问题. ...

  2. 关于领域驱动设计 DDD(Domain-Driven Design)

    以下旨在 理解DDD. 1.     什么是领域? 妈妈好是做母婴新零售的产品,应该属于电商平台,那么电商平台就是一个领域. 同一个领域的系统都有相同的核心业务. eg: 电商领域都有:商品浏览.购物 ...

  3. 完美解决PYQT5登录界面跳转主界面方法

    该问题,有很多种方法,但是很多方法要么这个有问题,要么那个有问题,最后终于找到一种没问题的方法.记录一下: Login.py(登录窗口)文件 import sys from PyQt5 import ...

  4. 基于Python3.7的robotframework环境搭建步骤

    一.前言 Robot Framework作为公司能快速落地实现UI自动化测试的一款框架,同时也非常适合刚入门自动化测试的朋友们去快速学习自动化,笔者计划通过从搭建逐步到完成自动化测试的过程来整体描述它 ...

  5. @font-face规则指定字体

    兼容性写法: @font-face { font-family: '字体名'; src: url('字体名.eot'); /* IE9 兼容模式 */ src: url('字体名.eot?#iefix ...

  6. Spring IOC原理补充(循环依赖、Bean作用域等)

    文章目录 前言 正文 循环依赖 什么是循环依赖? Spring是如何解决循环依赖的? 作用域实现原理以及如何自定义作用域 作用域实现原理 自定义Scope BeanPostProcessor的执行时机 ...

  7. Dubbo——SPI及自适应扩展原理

    文章目录 引言 正文 一.什么是SPI? 1. Java SPI的实现 2. Dubbo SPI实现原理 由配置文件得到的猜想 SPI源码 二.自适应扩展机制 三.Dubbo IOC 总结 引言 Du ...

  8. 【JMeter_16】JMeter逻辑控制器__随机控制器<Random Controller>

    随机控制器<Random Controller> 业务逻辑: 当每次执行到该逻辑控制器时,随机挑选控制器下的任意一个子节点<取样器.逻辑控制器> Ignore sub-cont ...

  9. vue-drag-resize 可拖拽可缩放的标签,如何管理多个拖拽元素之间的zIndex?操作上需要保持当前激活的组件是最上层,但是在总体上,又要确保其图层管理的顺序。

    麻烦总是不断出现,还好办法总比困难多, 1.公司开发一款可视化编辑html网页的多媒体编辑平台,牵扯到标签元素的拖拽,缩放,我找了找方法发现原生技术实现起来代码太多,麻烦,还好找到了一个vue组件,可 ...

  10. Beta 冲刺

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 Beta 冲刺 汇总博客 作业正文 如下 其他参考文献 ... 说明:此博客 ...