首页 > 解决方案 > 为什么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:好的,没关系!这就像命令行参数中的拼写错误一样简单!对不起,我不得不打扰你,我一直在寻找这个问题一段时间,只是卡住了。但感谢您花时间尝试寻找解决方案!

标签: shell

解决方案


根据POSIX shell 规范的第 2.13.3 节:

如果模式与任何现有文件名或路径名不匹配,则模式字符串应保持不变。

它没有忽略 glob,它只是无法匹配任何文件。目录中没有任何 Java 源文件。


其他 shell 可以修改此行为。举两个例子,

  • bash默认情况下按字面意思处理不匹配的模式,但可以选择将其视为错误或空列表(在这种情况下甚至不会进入循环)。
  • zsh有类似的选项,但默认将模式视为错误。

推荐阅读