为什么 *nix 文件系统支持带换行符的文件名?

为什么 *nix 文件系统支持带换行符的文件名?

根据这一页:

Linux 中的文件名可以包含除 (1) 正斜杠 ( / ) 之外的任何字符,正斜杠保留用作根目录(即包含所有其他目录和文件的目录)的名称和目录分隔符,以及 (2) 空字符(用于终止文本段)。允许使用空格,但最好避免使用空格,因为在某些情况下它们可能与旧版软件不兼容。

太好了,这两个限制都很有意义。既然显然可以禁止在文件名中包含某些字符,为什么允许换行符呢?据我所知,它们唯一的用途是使我们的脚本复杂化。文件名中是否有一个新行的有效理由?

答案1

NUL/具有其指定的系统功能。其他角色则不然。

这就是它的基础——剩下的就是观点、猜测和历史。听到、读到等,仅作为填料不是辩论或争论:

  • 通过禁止某些字符,您会增加文件系统本身的复杂性,这与损害它是一样的。
  • 在各种系统上哪些字节构成换行符呢?<CR><LF>
  • 如果远程系统决定在 NFS 上创建带有换行符的文件怎么办?
  • 如果文件名损坏而文件内容完好怎么办?
  • 如果应用程序在文件名中编码信息怎么办?

继续下去

  • 修复用户软件中的错误是系统的工作吗?
  • 系统是否应该在其根级别上保护用户免受自身侵害?
  • 各种 shell 的内部实现方式是否应该决定哪些文件名被视为合法?

基本操作系统没有设置限制。进出系统的信息是字节流。如果字节没有特殊含义,则不要通过添加应在用户空间处理的检查来创建开销。


无论如何,最大的问题很可能是允许换行符和其他控制字符的相当长的历史。

另一种情况是禁止什么。你提到了换行符,但在 UNIX 石器时代的讨论中,这个问题一直存在争议,然后还包括其他字符。应该*禁止吗?以 开头的文件名怎么样-?和DELESC?是否应该禁止所有控制字符?等等等等。

不幸的是,我不记得创始人或代码维护者对这个主题的任何引用。

相关内容