基于当前目录的globbing

Joe*_*Joe 0 linux bash yum wildcard rhel6

今天遇到了一些奇怪的行为。想知道这里是否有人可以告诉我什么是不同的行为。环境是 RHEL 6.7 服务器。

我运行以下命令:

yum list installed *mysql*

如果我的 cwd 是 / 或其他一些地方,我会得到以下输出:

Installed Packages MySQL-client-advanced.x86_64 5.6.27-1.el6 @/MySQL-client-advanced-5.6.27-1.el6.x86_64 MySQL-server-advanced.x86_64 5.6.27-1.el6 @/MySQL-server-advanced-5.6.27-1.el6.x86_64 MySQL-shared-advanced.x86_64 5.6.27-1.el6 @/MySQL-shared-advanced-5.6.27-1.el6.x86_64 MySQL-shared-compat-advanced.x86_64 5.6.27-1.el6 @/MySQL-shared-compat-advanced-5.6.27-1.el6.x86_64

在其他几个文件夹(包括此服务器上的 /opt)中,我运行相同的命令并获得以下输出:

Error: No matching Packages to list

现在我知道我通常需要在这个命令中转义通配符。如果我运行它:

yum list installed \*mysql\*

然后我在两个位置都得到了正确的输出。我认为这是因为 bash globs 通配符的方式。我现在真正想知道的是为什么它把它放在一个文件夹中,但不在另一个文件夹中。我都以 root 身份运行,printenv 显示相同的输出(PWD 除外),实际上,两次运行命令之间唯一变化的是cd /opt

谁能告诉我为什么会发生这种情况,或者要查看哪些内容以了解为什么会有所不同?TIA

Law*_*w29 5

这是因为*mysql*通配符的结果取决于您所在目录的内容。您的 shell 通过尝试将 * 字符与目录中的文件名匹配来解释 * 字符(除非您对其进行转义或将其隐藏在引号中)。

为了说明,执行(在每个有问题的目录中)

echo yum list installed '*mysql*'
echo yum list installed *mysql*
ls -ld *mysql*
Run Code Online (Sandbox Code Playgroud)