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

ter*_*don 10 filesystems filenames newlines

根据此页面

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

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

Run*_*ium 6

NUL/具有其指定的系统功能。其他字符没有。

这就是它的基础——剩下的就是意见、推测和历史。听到的,阅读等,并且仅包括作为填料不是辩论或参数:

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

然后继续

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

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


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

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

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

  • 您的其他示例都没有像“\n”那样有问题。他们都可以更容易地处理。检查“\n”的开销是一个有效的观点,但并不是什么大问题。我想说的是,避免这些令人头痛的开销是值得的。我想不出文件名应该包含“\n”的有效理由。 (3认同)