# /dev/null ——The Bit Bucket 的故事

img

Preconditions

  • ✅了解英文

  • ✅了解计算机

  • ✅了解 Linux 的基本使用

# Punched Machine History

img

在讨论今天的内容时,我们需要一点背景知识,让我们回到上上个世纪,以前了解下古老计算机程序的原型,上图是霍列瑞斯式的打孔机,最初是用于人口普查的数据记录,其工作原理就是使用标志位,有效位有效的话则直接在该位置打孔,具体的数字表示可以查看链接。20 世纪后,打孔卡开始应用在单位记录机作为输入端、处理和计算机程序。早期的数字电脑运用打孔机已输入信息的打孔卡当做计算机程序和资料的主要输入介质。下图是一张 80 列、矩形孔的标准的 IBM 打孔卡片,已经打孔表示了字符集。此类型用于存储数据。

1880 年代,美国人口调查局职员赫尔曼・何乐礼发明了用于人口普查数据的穿孔卡片及机器,并用于 1890 年美国人口普查,仅 6 周就完成了统计。而此前 1880 年美国人口普查的数据全靠手工处理,历时 7 年才得出最终结果。何乐礼创建的公司,发展为今日的 IBM。

​ —wiki

image-20210312105918342

这项技术后面逐步演化,演化成光学划记符号辨识Optical mark recognition, OMR),不再需要打孔,通过利用特殊颜色(黑色)对光的吸收等来实现识别的功能,应用领域也逐渐不在计算机和存储了,更多的应用在考试,投票等场景。

img

# Older PC

有了打孔机这个设备,早年的计算机就有了 “ interpreter ”,我们就可以利用它来进行转化。有人就要问了为什么早期的计算机程序要使用打孔卡,而不能像我们现在一样,用 B 语言或者 C 语言这样的高级语言来写呢?首先在 B 语言是在 1969 年发行,C 语言是在 1972 年才正式发行了出来,到计算机广泛支持还有一段时间,而在之前的计算机的计算没有高级语言,使用的都是汇编,而汇编最终转化成机器码。在早期的计算机没有能力完成将汇编转化成机器码,所以需要人工的进行转化,然后利用打孔机进行转化为机器码。

为了更好的阐述整个过程,我们以现代计算机的视角来还原这个流程:

编译 => 汇编 代码 => 机器码(以前就是汇编到机器码)

preview

获取到机器码后,我们就可以利用打孔机来制作纸袋,然后就能获得我们的程序了!当然这样的程序时没得 debug 的哈哈!!

preview

然后下面这个视频很好的演示和讲述了纸待编程的一些知识(需要一点英语能力)

# What ‘s the Bit Bucket?

还记得纸带的制作吗,用打孔机将有效的位进行打孔,打孔后掉落物料我们就会丢尽垃圾桶,因为我们丢掉的物料原本是一个位的信息,所以随着时间的流逝, Bit Bucket (比特桶)成为废弃无用比特的地方的总称。

/dev/null 我们就叫他 Bit Bucket ,当然他还有其他名称,例如黑洞,空路径,打孔桶,空设备或空。

/dev/null 文件是在引导时生成的伪设备文件。它没有大小(0 个字节),在磁盘上占用 0 个块,对所有用户都具有读 / 写权限。下面的屏幕快照显示文件和上次系统重新启动具有相同的日期和时间。

image-20210312121012759

这是一个字符设备文件。这使这个文件可以像未缓冲的设备(空设备)一样工作,并且可以接受数据流。当您访问设备文件时,您正在与驱动程序进行通信。在 /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 发送该字符)

等待EOF发送的mailx命令

$ 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 中一个不起眼却有不少作用的文件,同时其蕴藏的背景!

更新于

请我喝[茶]~( ̄▽ ̄)~*

Junwide Xiao 微信支付

微信支付

Junwide Xiao 支付宝

支付宝