shell - 为什么shell忽略星号glob
问题描述
我有以下代码:
#!/bin/sh (it is dash for me)
#... lines of code
dir="/home/user/files/" #as example, actually passed as commandline argument
for file in "$dir"/*.java; do
echo "$file"
done
我得到的输出是:
/home/user/files//*.java
在这种情况下,为什么我的 shell 会忽略 glob?
编辑:我当然检查了现有Java文件的目录。该目录中有 Java 文件。
问题是当我给它绝对目录名称而不是它似乎工作的变量时
编辑2:好的,没关系!这就像命令行参数中的拼写错误一样简单!对不起,我不得不打扰你,我一直在寻找这个问题一段时间,只是卡住了。但感谢您花时间尝试寻找解决方案!
解决方案
根据POSIX shell 规范的第 2.13.3 节:
如果模式与任何现有文件名或路径名不匹配,则模式字符串应保持不变。
它没有忽略 glob,它只是无法匹配任何文件。目录中没有任何 Java 源文件。
其他 shell 可以修改此行为。举两个例子,
bash
默认情况下按字面意思处理不匹配的模式,但可以选择将其视为错误或空列表(在这种情况下甚至不会进入循环)。zsh
有类似的选项,但默认将模式视为错误。
推荐阅读
- xml - 如何获取有关 XSLT 处理器运行的 XSL 版本的信息
- python - 使用 Python/numpy 从稀疏表示中有效地合并重复像素(通过求和)
- javascript - 无论类型如何,如何在任何 HTML 组件中设置(显示)值
- android - 当我按下相机 2 onImageAvailable 一次拍摄时,图像将被保存 10 次
- spring-batch - 使用 MultiResourceItemReader 时没有资源读取错误
- firemonkey - 慢速缩放和 Firemonkey TeeChart 界面
- spring-boot - Spring Boot 应用程序是否可以使用用 Clojure 编写的休息处理程序(REST API)?
- xml - 为 xsl 转换的嵌套循环生成序列号
- node.js - 编译时打字稿的界面似乎不起作用
- php - 在 SF4.4 中使用 setData 批量设置 Symfony 表单字段值