shell - ./*/ 是可移植的吗?
问题描述
我经常./*/
在 for 循环中使用
for d in ./*/; do
: # do something with dirs
done
匹配当前工作目录中的所有非隐藏目录,但我不确定这是否是一种可移植的方式。我的系统上安装了 bash、dash 和 ksh,它适用于所有系统,但由于POSIX 规范没有说明它(或者它隐含地说,我错过了它)我想我不能依赖它。我还检查了POSIX bug reports,但无济于事,那里也没有提到它。
它的行为实现或文件系统是否依赖?我在这里错过了什么吗?我怎么知道它是否便携?
解决方案
简短的回答:是的
长答案:
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> 字符时,使用路径名解析的接口可能会指定额外的约束。
推荐阅读
- javascript - 如何在 JavaScript 中将数据创建为限制为 5 个数据的对象数组
- reactjs - 一旦按下“提交”,NextJs ContactUs 表单就会重定向到外部 URL
- python - 如何让 Pydantic 立即引发异常
- python - 在 Amazon sagemaker 上安装 docker 后守护程序未启动
- node.js - 有时客户端没有收到 websocket.send 事件
- php - 在 php 中使用 curl 下载 pdf 的问题。下载的文件已损坏
- visual-studio - 蓝色下划线是什么原因?扑
- azure - AzureDevops 确保已注册测试发现者和执行者,并且平台和框架版本设置正确,然后重试
- video - 我可以使用ffmpeg或ffprobe获取h.264每一帧的引用列表吗?
- r - 将图例添加到具有两个系列的 ggplot geom_point/geom_errorbar 图