Глобализация на основе текущего каталога

Глобализация на основе текущего каталога

Сегодня столкнулся со странным поведением. Интересно, может ли кто-нибудь здесь сказать мне, что ведет себя по-другому. Окружение — сервер 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*зависит от содержимого каталога, в котором вы находитесь. Ваша оболочка интерпретирует символ * (если вы не экранируете его или не спрячете в кавычки), пытаясь сопоставить его с именами файлов в каталоге.

Для иллюстрации выполните (в каждом из рассматриваемых каталогов)

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

Связанный контент