# /dev/null
——The Bit Bucket 的故事
Preconditions
✅了解英文
✅了解计算机
✅了解 Linux 的基本使用
# Punched Machine History
在讨论今天的内容时,我们需要一点背景知识,让我们回到上上个世纪,以前了解下古老计算机程序的原型,上图是霍列瑞斯式的打孔机,最初是用于人口普查的数据记录,其工作原理就是使用标志位,有效位有效的话则直接在该位置打孔,具体的数字表示可以查看链接。20 世纪后,打孔卡开始应用在单位记录机作为输入端、处理和计算机程序。早期的数字电脑运用打孔机已输入信息的打孔卡当做计算机程序和资料的主要输入介质。下图是一张 80 列、矩形孔的标准的 IBM 打孔卡片,已经打孔表示了字符集。此类型用于存储数据。
1880 年代,美国人口调查局职员赫尔曼・何乐礼发明了用于人口普查数据的穿孔卡片及机器,并用于 1890 年美国人口普查,仅 6 周就完成了统计。而此前 1880 年美国人口普查的数据全靠手工处理,历时 7 年才得出最终结果。何乐礼创建的公司,发展为今日的 IBM。
—wiki
这项技术后面逐步演化,演化成光学划记符号辨识(Optical mark recognition, OMR),不再需要打孔,通过利用特殊颜色(黑色)对光的吸收等来实现识别的功能,应用领域也逐渐不在计算机和存储了,更多的应用在考试,投票等场景。
# Older PC
有了打孔机这个设备,早年的计算机就有了 “ interpreter
”,我们就可以利用它来进行转化。有人就要问了为什么早期的计算机程序要使用打孔卡,而不能像我们现在一样,用 B 语言或者 C 语言这样的高级语言来写呢?首先在 B 语言是在 1969 年发行,C 语言是在 1972 年才正式发行了出来,到计算机广泛支持还有一段时间,而在之前的计算机的计算没有高级语言,使用的都是汇编,而汇编最终转化成机器码。在早期的计算机没有能力完成将汇编转化成机器码,所以需要人工的进行转化,然后利用打孔机进行转化为机器码。
为了更好的阐述整个过程,我们以现代计算机的视角来还原这个流程:
编译 => 汇编 代码 => 机器码(以前就是汇编到机器码)
获取到机器码后,我们就可以利用打孔机来制作纸袋,然后就能获得我们的程序了!当然这样的程序时没得 debug 的哈哈!!
然后下面这个视频很好的演示和讲述了纸待编程的一些知识(需要一点英语能力)
# What ‘s the Bit Bucket?
还记得纸带的制作吗,用打孔机将有效的位进行打孔,打孔后掉落物料我们就会丢尽垃圾桶,因为我们丢掉的物料原本是一个位的信息,所以随着时间的流逝, Bit Bucket
(比特桶)成为废弃无用比特的地方的总称。
/dev/null
我们就叫他 Bit Bucket
,当然他还有其他名称,例如黑洞,空路径,打孔桶,空设备或空。
/dev/null
文件是在引导时生成的伪设备文件。它没有大小(0 个字节),在磁盘上占用 0 个块,对所有用户都具有读 / 写权限。下面的屏幕快照显示文件和上次系统重新启动具有相同的日期和时间。
这是一个字符设备文件。这使这个文件可以像未缓冲的设备(空设备)一样工作,并且可以接受数据流。当您访问设备文件时,您正在与驱动程序进行通信。在 /dev/null
的情况下,它充当具有特定目的驱动程序的伪设备。它会丢弃您写入的所有内容,并且仅在读取时返回 EOF
字符。发送 EOF
意味着使进程知道不会发送任何其他输入(文件末尾)。
# How to use it ?
利用 /dev/null
的特性,我们就能有以下三种用途:
- 用于抑制输出
- 用于添加文末的
EOF
- 用于清空文件夹
# 抑制输出
在一些脚本工具编写中,经常会使用到很多命令工具,而很多工具往往有大量的文本输出打印,有一些时敏感信息,有一些对用户没有任何帮助,所以这种情况下就会使用到抑制输出的功能,使得命令执行而不打印任何输出。用法如下:
$ stat /etc/passwd > /dev/null |
Note:发送到
/dev/null
的数据将立即被丢弃,并且无法恢复。
# 添加文末 EOF
/dev/null
的一个常见用法是提供一个空白或空输入,除了 EOF
字符外什么都没有。可能大家不理解为什么需要使用此功能。但是,有许多实用程序需要 EOF
字符才能继续。例如, mailx
将允许您从命令行键入电子邮件。它将继续等待输入,直到接收到 EOF
字符为止(通过按 CTRL + D
发送该字符)
$ mailx -s "Just Another Email" user@putorius.net < /dev/null | |
Null message body; hope that's ok |
# 清空文件夹
/dev/null
可以用来清空文件的内容。 如果使用 >
重定向操作符将 /dev/null
重定向到文件中,它将有效地删除该文件的内容。
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 | ||
cat /dev/null > scp.log | ||
ls -l scp.log | ||
-rw-r--r--. 1 savona savona 0 Nov 11 21:32 scp.log |
使用 cp
命令也能做到
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 | ||
cp /dev/null scp.log | ||
cat scp.log | ||
ls -l scp.log | ||
-rw-r--r--. 1 savona savona 0 Nov 11 21:34 scp.log |
# Conclusion
介绍了一个 Linux 中一个不起眼却有不少作用的文件,同时其蕴藏的背景!