这是globbing的测试。请注意,对于$ PATH和$ NOTHER,globbing的工作方式正常,但对于$ JAVACLASSPATH则没有。相反,即使没有匹配,也会回显令牌,因为没有包含冒号:
的文件名。
> ls -l
total 8
-rw-rw-r-- 1 brian brian 6 Sep 7 16:20 lib.txt
-rwxrwxr-x 1 brian brian 102 Sep 7 16:18 test.sh
> cat test.sh
#!/bin/bash
PATH='*'
JAVACLASSPATH='lib:*'
NOTHER='lib*'
echo $PATH
echo $JAVACLASSPATH
echo $NOTHER
> ./test.sh
lib.txt test.sh
lib:*
lib.txt
>
为什么令牌会回显?看来globbing是禁用的,这是令人惊讶的(但对Java程序员来说很方便,因为glob扩展使用的是空格分隔符,这在Linux上需要:
类之间的分隔符的Linux上是错误的,因为*有一个java的特殊含义,因为它意味着"所有JAR文件")。
编辑:正如heemayl所示,当没有匹配时,glob会生成一个未更改的令牌,并且它是记录的行为。这意味着Java类路径将看到*表示"所有JAR文件"这可能是一个很好的副作用,但令人惊讶的副作用很糟糕。
答案 0 :(得分:2)
这是因为您将当前目录中的文件与glob模式匹配,并且当前目录中没有以lib:
开头的文件。如果你有一个像lib:txt
这样的文件,那么glob模式lib:*
会扩展为那个。
当任何文件与glob模式不匹配时,将按字面处理模式,引用man bash
的相关部分:
如果找不到匹配的文件名,并且未启用shell选项nullglob,则该单词保持不变。
如果您愿意,可以使用nullglob
shell选项阻止此行为:
shopt -s nullglob