./*/是否可移植?

3
我经常在for循环中使用./* /,例如:
for d in ./*/; do
  : # do something with dirs
done

为了匹配当前工作目录中所有非隐藏目录,但我不太确定这是否是一种可移植的方法。我的系统上安装了bash、dash和ksh,它们都可以使用,但由于POSIX规范对此没有任何说明(或者它含蓄地说了,而我错过了),因此我认为我不能依赖它。我还查看了POSIX错误报告,但没有发现相关提及。
它的行为是实现或文件系统依赖的吗?我有什么遗漏的吗?我怎样才能知道它是否具有可移植性?
1个回答

6
短答案:是的。
长答案:
POSIX标准(来自opengroup)规定,/仅匹配扩展文件名中的斜杠。由于Unix/Linux不允许在文件名中使用/,我认为这在Unix/Linux系统上是一个安全的假设。
从下面加粗的文字中可以看出,即使对于允许在文件名中使用/的系统,POSIX标准也要求不将其与此类文件匹配。
在Windows上,看起来不允许在文件名中使用/,但我不是Windows专家。
Shell Programming Language § Patterns Used for Filename Expansion中可以看出:
引用:

路径名中的斜杠字符应通过在模式中使用一个或多个斜杠字符显式匹配;它既不能被*或?特殊字符匹配,也不能被括号表达式匹配。在模式中识别斜杠之前,应识别模式中的斜杠表达式;因此,不能将斜杠包括在用于文件名扩展的模式括号表达式中。 ...

额外说明 - 澄清路径名:
路径名在4.13中定义,并明确提到带有尾随斜杠的路径名在General Concepts § Pathname Resolution中。
引用:

包含至少一个非<slash>字符并以一个或多个尾随<slash>字符结尾的路径名,除非在尾随<slash>字符之前的最后一个路径名组件命名现有目录或要在解析路径名后立即创建目录的目录条目,否则将无法成功解析。使用路径名解析的接口可能在不包含现有目录名称的路径名中包含至少一个非<slash>字符并包含一个或多个尾随<slash>字符时指定其他约束。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接