首页 > 解决方案 > ./*/ 是可移植的吗?

问题描述

我经常./*/在 for 循环中使用

for d in ./*/; do
  : # do something with dirs
done

匹配当前工作目录中的所有非隐藏目录,但我不确定这是否是一种可移植的方式。我的系统上安装了 bash、dash 和 ksh,它适用于所有系统,但由于POSIX 规范没有说明它(或者它隐含地说,我错过了它)我想我不能依赖它。我还检查了POSIX bug reports,但无济于事,那里也没有提到它。

它的行为实现或文件系统是否依赖?我在这里错过了什么吗?我怎么知道它是否便携?

标签: shellshposixglob

解决方案


简短的回答:是的

长答案:

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> 字符时,使用路径名解析的接口可能会指定额外的约束。


推荐阅读