【问题标题】:Is ./*/ portable?./*/ 是可移植的吗?
【发布时间】:2020-01-30 06:05:39
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: shell sh posix glob


    【解决方案1】:

    简短回答:是的

    长答案:

    POSIX 标准(来自 opengroup)声明 / 只会匹配扩展文件名中的斜杠。由于 Unix/Linux 不允许在文件名中使用 /,我相信这在 Unix/Linux 系统上是一个安全的假设。

    从下面的粗体文本看来,即使对于允许在文件名中包含 / 的系统,POSIX 标准也要求 / 不会与此类匹配文件。

    在 Windows 上,文件名中似乎不允许出现 /,但我不是 Windows 专家。

    来自Shell Programming Language § Patterns Used for Filename Expansion

    路径名中的斜线字符应通过在模式中使用一个或多个斜线来显式匹配;它既不能与星号或问号特殊字符匹配,也不能与括号表达式匹配。模式中的斜线应在括号表达式之前标识;因此,斜线不能包含在用于文件名扩展的模式括号表达式中。 ...

    附加说明 - 澄清路径名:

    路径名在 4.13 中定义,在 General Concepts § Pathname Resolution 中明确引用带有斜杠的路径名。

    包含至少一个非字符且以一个或多个尾随字符结尾的路径名不能成功解析,除非尾随字符之前的最后一个路径名组件命名现有目录或在解析路径名后立即为目录创建的目录条目。当未命名现有目录的路径名包含至少一个非 字符并且包含一个或多个尾随 字符时,使用路径名解析的接口可能会指定额外的约束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 2017-03-11
      相关资源
      最近更新 更多