为什么外壳程序忽略星号

时间:2020-06-27 15:00:18

标签: shell

我有以下代码:

#!/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:好吧,没关系!就像在命令行参数中拼写错误一样简单!抱歉,我不得不打扰您,我已经寻找问题了一段时间,只是被卡住了。但是感谢您抽出宝贵的时间来寻找解决方案!

1 个答案:

答案 0 :(得分:0)

根据POSIX shell规范的section 2.13.3

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

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


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

  • bash在默认情况下按字面意义处理了不匹配的模式,但是具有将一个模式视为错误列表或空列表的选择(在这种情况下,甚至不会输入循环)。
  • zsh具有相似的选项,但默认情况下会将模式视为错误。