根据当前目录进行通配

根据当前目录进行通配

今天遇到了一些奇怪的行为。想知道这里是否有人可以告诉我什么行为不同。环境是 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 如何匹配通配符。我现在真正想知道的是为什么它在一个文件夹中匹配通配符,而在另一个文件夹中不匹配。我以 root 身份运行这两个文件夹,printenv 显示相同的输出(PWD 除外),实际上,两次运行命令之间唯一改变的是cd /opt

谁能告诉我为什么会发生这种情况,或者要观察哪些因素才能发现为什么情况会有所不同?TIA

答案1

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

为了说明,执行(在每个相关目录中)

echo yum list installed '*mysql*'
echo yum list installed *mysql*
ls -ld *mysql*

相关内容