
今日、奇妙な動作に遭遇しました。何が違うのか教えていただける方はいらっしゃいますか。環境は 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*