关于那些魔术般的名字(NUL, CON, PRN…)

关于那些魔术般的名字(NUL, CON, PRN…)

作者:BlogUpdater |  时间:2020-06-21 |  浏览:201 |  评论已关闭 条评论

让我们先回到DOS 1.0那会。
DOS 1.0操作系统不支持子目录,小写文件名或者超过8.3长度的文件名。
当你尝试执行汇编器(Assembler)(或者编译器,你如果够时髦的话)的时候,实际的会有如下的交互式对话发生:

A > asm foo // .asm文件后缀会隐式的添加到foo文件名后
Assembler version XXX
Source file: FOO.ASM
Listing file [FOO.LST]: // 直接点击回车接受默认设定
Object file [FOO.OBJ]: // 直接点击回车接受默认设定

Assembler cranks away

你只需要输入文件的基础名称(这里是foo),LST和OBJ文件后缀会被自动地添加到文件名中。实际上,我想你应该也没法禁用扩展名,因为它们总是会被添加进去。

但是,如果你不想生成一个LST文件,那咋办?
汇编器一定会要求有一个文件名输入,如果你没有输入任何文件名,则汇编器会创建一个和源文件同名的LST文件。

这个时候,黑魔法要来了。

假设你想直接将LST文件发送到打印机,但是你不想在软盘里创建这个文件,因为软盘可能没有足够的空间了,又或者,你不想花费时间来创建一个最终都会被删除的文件。
因此,你输入了”PRN”作为文件名。

这个时候,汇编器并不知道这个”魔术般”的文件名。因此,它会尝试创建”PRN.LST”这个文件并尝试往里面写些东西。汇编器如同被蒙在鼓里一般,它以为它在想文件写入数据,实际上,它想写的东西已经直接发往了打印机那里去了。

如果你希望彻底地忽略掉输出,则你可能会输入”NUL”,你当然知道这么做啦。
如果你希望输出内容到屏幕,你就会明智地输入”CON”。

如果你认真的读到了这里,应该会明白上面的故事已经解释了下面的两件事情:

> 为什么即使我添加了文件后缀,这个法术依然奏效?
答案:如果添加一个文件后缀就让法术不奏效了,那当汇编器添加LST到文件名的时候,法术就不能正常工作了,这违背了法术创建之初的初衷。

> 为什么在每一个目录里,都会看到这些魔法文件?
答案:因为在DOS 1.0操作系统中,没有子目录这个概念。
在系统中只有一个目录,用我们今天的说法,它应该叫做”根目录”,但是在那个时候,因为系统中本来就没有子目录,所以人们也不会给它起一个像模像样的名字。人们只是这样说:磁盘中的文件,而不会说:某个目录下的文件。
如果魔术文件不存在于子目录中,则当你尝试使用CHDIR命令进入到某个子目录后,你会发现你输入”NUL”不再奏效了,对于你而已:这块明明应该来点法术才对呀?

但是,时间都过去这么久了,为什么我们还是支持这些魔术文件名呢?

因为就算是现在,还是有一些人依赖这种工作机制。就随便打开一个批处理脚本看看,我们就能看到类似于 >NUL 或者 “if exist directoryname\nul”这样的写法,另外,所有的文档里也会有这样的说法:请使用”copy CON …”来创建一个文件。

事已至此:还是留着吧。

评论已关闭。