通过令牌的打印替换了globbing行为

时间:2016-09-07 20:38:10

标签: bash glob

这是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文件"这可能是一个很好的副作用,但令人惊讶的副作用很糟糕。

1 个答案:

答案 0 :(得分:2)

这是因为您将当前目录中的文件与glob模式匹配,并且当前目录中没有以lib:开头的文件。如果你有一个像lib:txt这样的文件,那么glob模式lib:*会扩展为那个。

当任何文件与glob模式不匹配时,将按字面处理模式,引用man bash的相关部分:

  

如果找不到匹配的文件名,并且未启用shell选项nullglob,则该单词保持不变。

如果您愿意,可以使用nullglob shell选项阻止此行为:

shopt -s nullglob