通配行为正在被标记的打印所取代

globbing behaviour is being replaced by the print of a token

这是 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 扩展使用 space 分隔符,这在 Linux 上是错误的,其中 java 需要 : 在 类 之间使用分隔符,这也很方便,因为 * 对 java 有特殊含义,因为它表示 "all the JAR files").

编辑:正如 heemayl 所示,当没有匹配项时,glob 会生成一个未更改的标记,这是记录在案的行为。这意味着 Java 类路径将看到 * 这意味着 "all the JAR files" 这可能是一个很好的副作用,但令人惊讶的副作用是坏的。

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

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

If no matching filenames are found, and the shell option nullglob is not enabled, the word is left unchanged.

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

shopt -s nullglob