POSIX 中是否存在无法与文件(常规或不规则)关联的合法路径?也就是说,哪些路径test -e "$LEGITIMATEPOSIXPATHNAME"
无法成功?
澄清 #1:路径名
我所说的“POSIX 中的合法路径”是指 POSIX 允许的路径,而不是 POSIX 未明确禁止的路径。我查了一下,POSIX 规范将它们称为以下字符串:
- 仅使用可移植文件名字符集中的字符
[a-zA-Z0-9._-]
(参见http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap03.html#tag_03_276(英文): - 不要以
-
; 和 - 长度介于 1 和 NAME_MAX 之间,对于 POSIX 来说,该数字未指定,但不小于 14。
POSIX 还允许文件系统可能比这更宽松,但它禁止字符 NUL 和/
出现在文件名中。请注意,lost+found
根据此定义,像这样的典型 UNIX 文件名不是 FPF。还有另一个常量 PATH_MAX,其用法无需进一步解释。
理想的答案将使用 FPF,但我对 POSIX 未明确禁止的文件名的任何示例都感兴趣。
澄清#2:不可能
显然,路径名通常可以绑定到文件。但是 UNIX 语义会告诉您,有些特殊位置通常不能创建任意文件,例如在目录中/dev
。POSIX 中是否规定了任何此类特殊位置?这就是问题所在。
答案1
因为最后一个问题是,是否存在一些特殊的地方,通常不能有文件,比如 POSIX 规定的 /dev 目录,那么答案就是是的。
预定文件和目录的完整列表在第 10 章中给出,POSIX 目录结构和设备, 的IEEE 开放群组基础规范第 6 期:
符合要求的系统上应存在以下目录,符合要求的应用程序应仅按所述方式使用它们。严格符合要求的应用程序不应假定能够在任何这些目录中创建文件,除非下文另有规定。
/
根目录。
/dev
包含 /dev/console、/dev/null 和 /dev/tty,如下所述。符合要求的系统上应存在以下目录,并应按描述使用:
/tmp
为需要创建临时文件的应用程序提供的目录。应允许应用程序在此目录中创建文件,但不应假定此类文件在应用程序调用之间得到保留。下列文件应存在于符合要求的系统上,并且应可读可写:
/dev/null
无限数据源和数据接收器。写入 /dev/null 的数据将被丢弃。从 /dev/null 读取的数据将始终返回文件结尾 (EOF)。
/dev/tty
在每个进程中,与该进程的进程组关联的控制终端的同义词(如果有)。对于希望无论输出如何重定向都能确保向终端写入消息或从终端读取数据的程序或 shell 过程,它很有用。当需要键入输出并且很难找出当前正在使用的终端时,它还可以用于需要文件名进行输出的应用程序。下列文件应存在于符合要求的系统上,且不需要可读或可写:
/dev/console
/dev/console 文件是系统控制台的通用名称(请参阅系统控制台)。它通常链接到实现定义的特殊文件。它应提供符合 IEEE Std 1003.1-2001 基本定义卷第 11 章通用终端接口要求的系统控制台接口。
答案2
测试包含空字符的文件名总是会失败。
POSIX 在文件名中保留 '/' 和 null。这是合理的:一个是目录分隔符,一个是字符串终止符。为了支持这一点,Wikipedia 说 ext2、ext3 和 ext4 允许文件名中除 null 和正斜杠之外的所有字节。NTFS(无论是否处于 POSIX 兼容模式)仅禁止上述内容;FAT 变体也禁止 null。理论上,这实际上取决于文件系统。但我不会屏住呼吸试图找到 null 进入文件名的情况。
答案3
/dev/null/impossible
不能存在。这是因为/dev/null
必须是文件,所以不能是目录。
/dev/tty/impossible
和相同/dev/console/impossible
答案4
如果文件名违反了 POSIX 本地实现的限制,则测试将失败。
现有的每个文件系统都会对最大长度、目录递归限制等做出假设。因此,在一个操作系统上合法的 POSIX 名称在另一个操作系统上可能不合法。
所以我对这个问题的回答是“是”:
由于实施限制,即使在一个 POSIX 系统上测试时合法的名称,也可能会被另一个系统拒绝。