现在,将时光机设置为 DOS 1.0。
DOS 1.0 不支持子目录、小写或长于 8.3 的文件名。
当你运行汇编程序(或者编译器,如果你真的很感兴趣的话)时,对话是这样的:
A>asm foo the “.asm” extension on “foo” is implied Assembler version blah blah blah Source file: FOO.ASM Listing file [FOO.LST]: just hit Enter to accept the default Object file [FOO.OBJ]: just hit Enter to accept the default Assembler cranks away
您只需要键入文件的基本名称,而“.LST” 和 “.OBJ” 是被自动添加上的。实际上,我认为您无法禁用扩展程序,它们总是被添加进来的。
但是,如果您不想要列表文件,该怎么办?汇编程序要求一个文件名,如果您根本没有键入任何文件名,它将创建一个与源文件具有相同基名的文件名。
这就是神奇文件名的用武之地。假设您希望列表文件直接转到打印机。您不想在软盘驱动器上创建文件,因为可能没有足够的空间来容纳它,或者只是因为您不想浪费时间创建文件只是为了删除它。因此,您键入“PRN”作为文件名。
现在,汇编程序不知道这些神奇的文件名。因此,汇编程序将尝试创建文件“PRN.LST“,然后开始写入它。汇编人员很少意识到输出实际上会流向打印机。
如果要完全放弃输出,当然可以键入“NUL”。如果你想让它进入屏幕,你可以输入“CON”。
现在,如果你仔细观察,你可以看到上面的故事已经解释了两件事:
- Why are the magic filenames magical even if I add an extension?
- Why do these magic files exist in every directory?
针对第一个问题,如果某个扩展删除了魔术,那么当汇编程序添加“。LST“的文件名,它将不再被识别为魔法,从而违背了魔法的目的。
针对第二个问题,这主要是因为 DOS 1.0 没有子目录。只有一个目录,今天我们称之为根目录,但是当时,由于没有子目录这样的东西,因此首先没有必要讨论目录,更不用说给出您唯一有名称的目录了。它只是被称为“磁盘上的文件”。如果魔术文件在子目录中不起作用,那么当您尝试(例如)将 chdir 放入子目录中然后运行汇编程序时,您将无法输入“NUL”作为文件名并获取魔术。
但是,为什么我们甚至在今天仍然将这些神奇的文件名向前推进呢?
因为每个人仍然依赖他们。只需查看所有执行诸如重定向到>NUL之类的操作的批处理文件,或者通过询问“如果存在 文件名\nul
”来测试目录是否存在,或者所有说明使用“copy CON …”创建文件的文档。