我刚刚遇到以下问题Unix编程环境,Kernighan 和 Pike 关于 Unix 的经典书籍(我在 1984 年版第 79 页找到了以下文字,ISBN:0-13-937699-2):
练习 3-6。(技巧问题)如何将 / 放入文件名中(即不分隔路径组成部分的 / ?
作为最终用户和程序员,我已经使用 Linux 多年了,但我无法回答这个问题。有决不在文件名中添加斜杠是内核绝对禁止的。您可以通过块设备访问来修补文件系统,或者使用 Unicode 中类似的字符,但这些都不是解决方案。
我知道 Linux ≠ Unix,但应该适用相同的原则,因为系统必须能够明确地从路径中提取目录层次结构。
有人知道,克尼根和派克在问这个问题时到底想到了什么吗?应该的答案是什么?到底什么是‘伎俩’?或者也许原始的 Unix 系统只是允许以某种方式转义这个斜线?
更新:
我就这个问题联系了 Brian Kernighan,他是这样回答的:
答案是(或者曾经是)“你不能。”
因此,蒂莫西·马丁是对的,并获得了绿色勾号。
答案1
也许答案与这个棘手问题的部分答案相同:
如何从大象身上下来? 你不知道。 你从鹅那里得到它。
摘自 Brian W. Kernighan 和 Rob Pike 的《编程实践》,第 1 章第 6 页。 158:
当 Steve Bourne 编写他的 Unix shell(后来被称为 Bourne shell)时,他创建了一个包含 254 个文件的目录,这些文件具有单字符名称,每个字节值一个字符,除了“\0”和斜杠,这两个字符表示不能出现在 Unix 文件名中。
答案2
我已经做到了这一点。这是在 1980 年左右的某个时间在 PDP-11 上运行的 UNIX 系统上。我创建了一个名为“WhatXNow?”的文件。然后,我使用二进制文件“编辑器”来编辑磁盘设备,并将 inode 中的“X”更改为“/”(未安装文件系统)。
受害者始终不知道如何将其移除。
编辑:哎呀,巴马尔是对的,我没有看到其中关于不修补设备的行。是的,这是我编辑的目录,而不是索引节点。有一阵子了 :-)
答案3
任何场景/
(更准确地说,一个字节——而不是一个字符——值为 0x2f;几乎所有 Unix 内核都故意忽略字符编码)在没有手动操作原始磁盘块的情况下找到进入目录条目的方式,毫无疑问是内核中的一个错误。
此类错误确实时常发生。我记得读过补丁说明的一个案例是,一些 20 世纪 90 年代的迭代……我想说 Solaris,但这可能是错误的……为 AppleTalk 文件协议 (AFP) 提供了一个服务器,这是经典 MacOS 的 NFS 等价物。问题是,在经典的 MacOS 上,你完全可以放入/
路径名组件;相反,目录分隔符:
。法新社服务器是应该道德上相当于tr :/ /:
将客户端提交的路径名映射到其磁盘上的文件,但它们错过了几个代码路径,并且因为服务器是在内核内部实现的,所以它实际上可能写出错误的目录条目。
(看comp.unix 常见问题解答 #2.2,以“如果文件名中包含‘/’怎么办?”开头的小节,用于上述内容的较长版本。)