現在のディレクトリに基づくグロブ

現在のディレクトリに基づくグロブ

今日、奇妙な動作に遭遇しました。何が違うのか教えていただける方はいらっしゃいますか。環境は 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 がワイルドカードをグロブする方法によるものだと推測しています。今本当に知りたいのは、なぜ 1 つのフォルダーではグロブされるのに、もう 1 つのフォルダーではグロブされないのかということです。私は両方とも root として実行していますが、printenv は (PWD 以外) 同一の出力を表示します。文字通り、両方のコマンドの実行で変わるのは、cd /opt

なぜこのようなことが起こるのか、また、なぜ違うのかを知るために何に注意すればよいのか、誰か教えていただけませんか?

答え1

これは、グロブの結果が、*mysql*現在いるディレクトリの内容によって異なるためです。シェルは、* 文字を (エスケープするか引用符で隠さない限り) ディレクトリ内のファイル名と一致させて解釈します。

例えば、(問題の各ディレクトリで)実行します。

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

関連情報