/Dev/Null
在 Linux 系统代表了一个空设备,它会丢弃写入的任何内容,返回一个 EOF 字符。这里将介绍这个目录的一些重要的应用。
原文链接: https://www.putorius.net/introduction-to-dev-null.html
如果你已经使用过Linux有一段时间,那么可能已经碰到位储存桶(bit bucket),它通常被写成/dev/null
。如果理解这个特殊的文件它是如何工作以及它的重要性,它将成为宝贵的工具。在这篇文章中,我们将讨论/dev/null
是什么,如何使用它还有为什么它被命名为为储存桶(bit bucket)。我们也将同时探索一些它在实践中的一些例子。
为什么叫位储存桶(bit bucket)?
早期的计算机用穿孔卡片(punch cards)来储存数据和编写代码。
穿孔卡片最初由Herman Hollerith申请专利,首次使用霍勒瑞斯利用纽约市卫生局的制表机记录生命统计数据,后来在1890年的人口普查中,霍勒瑞斯从提花织机中使用的卡片中得到了这个想法,提花织机使用卡片来控制编织图案霍勒瑞斯发明了机电机器,包括打孔装置、制表机和分拣机,这些机器可以用来积累和储存统计数据。
当机器冲出孔洞的时候,没有用到的物料将会被丢到桶(bucket)中。随着时间的流逝,bit bucket就成为了废弃无用bit的地方的总称。
/dev/null
的其他名字还有 黑洞(black hole),空路线(null route),穿孔桶(punch bucket),空设备(null device)或者 空(null)。
/dev/null
文件
/dev/null
文件是一个伪设备文件在开机的时候被生成。它没有大小(0 bytes),不占用磁盘的任何块(0 blocks),对所有的用户都有读/写权限。下面的图片显示/dev/null
文件和上次系统重启有相同的日期和时间。
![图1](https://www.putorius.net/wp-content/uploads/2019/11/dev-null-diag1-min.png.webp /mos/2022/10/4b893240-2961-4a78-bc1a-786d1c714211.webp)
这是一个被称为字符设备文件的特殊文件。这些文件可以像一个未缓冲的设备(空设备)一样工作,并且接受数据流。当你访问设备文件时,会和驱动程序进行通讯。在/dev/null
情况下,它充当一个有特殊目的的带有驱动的伪设备。它会丢弃你写入的任何东西,而且仅在读取的时候返回EOF字符。发送EOF字符的多或少会使得进程清楚没有额外的输出被发送(在文件末尾)。
使用/dev/null
文件
/dev/null
文件常常用来阻止输出。比如说在下面的例子中,我们使用>
重定向操作符将输出送到位储存桶中。
stat /etc/passwd > /dev/null
这种做法有效的阻止了命令输出(标注输出)。
我们也可以使用/dev/null
来阻止标准错误的输出,就像下面这个例子这样
stat /etc/passwdss 2> /dev/null
我们修改了文件名为passwdss,由于这个文件是不存在的,所以会显示“没有这样的文件或目录”错误。但是,因为我们将STDERR(标准错误)输出重定向到/dev/null
,所以错误被丢弃。
![https://www.putorius.net/wp-content/uploads/2019/11/ani-diag1-min.gif](https://www.putorius.net/wp-content/uploads/2019/11/ani-diag1-min.gif /mos/2022/10/adbb52d4-89d9-4d33-ad6d-321a92d48079.gif)
备注:要了解有关重定向和标准数据流(stdin、stdout、stderr)的更多信息,可以阅读“Linux I/O、标准流和重定向”。
注意:发送到/dev/null的数据将立即被丢弃,并且不可恢复。
使用/dev/null
来输入EOF(文件结尾符)
/dev/null
的另一个常见用法是提供一个只有EOF字符的空白或null输入。可能并不清楚为什么需要这样一个函数。但是,有许多实用程序需要EOF字符才能继续。例如,mailx实用程序将允许您从命令行键入电子邮件。它将继续等待输入,直到它收到一个EOF字符,这个字符是通过按CTRL+D发送的。这会告诉实用程序您不打算再发送任何输入。
![https://www.putorius.net/wp-content/uploads/2019/11/ani-diag-mail-fast-min.gif](https://www.putorius.net/wp-content/uploads/2019/11/ani-diag-mail-fast-min.gif /mos/2022/10/434dfe23-056e-495d-999b-d112d4e04598.gif)
注意:EOT(传输结束)和EOF(文件结束)有技术上的区别,这可以归结为编码,但是不在本文的探讨范围之内。
如果我们想发送一封空白电子邮件,我们必须进入交互模式,在没有输入的情况下按CTRL+D。如果以脚本或其他无人参与的方式使用,这是没有办法办到的。而作为一种解决方法,我们可以将/dev/null重定向到mailx命令中,以便为我们做到这一点。
$ mailx -s "Just Another Email" user@putorius.net < /dev/null
Null message body; hope that's ok
使用/dev/null
清空文件
/dev/null
文件的另一个常见用法是清空文件的内容。如果使用“>”重定向操作符将/dev/null
重定向到一个文件中,它将有效地擦除该文件的内容。
如下例子所示:
[savona@putor ~]$ cat scp.log
Changing to backup directory…
Sending SCP request to download fw-backup-2019_11_10…
fw-backup-2019_11_10-03_03_27-2.0.32.zip 100% 536MB 2.8MB/s 03:14
[savona@putor ~]$
[savona@putor ~]$ cat /dev/null > scp.log
[savona@putor ~]$
[savona@putor ~]$ ls -l scp.log
-rw-r--r--. 1 savona savona 0 Nov 11 21:32 scp.log
[savona@putor ~]$ cat scp.log
[savona@putor ~]$
另一个操作是使用cp命令在文件上复制/dev/null,如下所示:
[savona@putor ~]$ cat scp.log
Changing to backup directory…
Sending SCP request to download fw-backup-2019_11_10…
fw-backup-2019_11_10-03_03_27-2.0.32.zip 100% 536MB 2.8MB/s 03:14
[savona@putor ~]$
[savona@putor ~]$ cp /dev/null scp.log
[savona@putor ~]$
[savona@putor ~]$ cat scp.log
[savona@putor ~]$ ls -l scp.log
-rw-r--r--. 1 savona savona 0 Nov 11 21:34 scp.log
[savona@putor ~]$
总结
bit bucket(/dev/null
)对于系统管理员、devops工程师以及几乎所有使用命令行的人来说都是一个重要而有用的工具。在本文中讨论了/dev/null的一些最常见用法,但是一旦知道它的用途,你会找到更多方法来使用它。