こんにちは,yourilです.
タイトルの通りBashのキャッシュでハマったので,備忘録として残します.
TL;DR
コマンドを入れ直したりしてパスが変わると,Bashは以前実行したコマンドのパスをキャッシュするため,古いパスを参照して「コマンドが見つからない」と怒られることがある.
その場合,以下2つのコマンドでBashのキャッシュの確認,削除ができるので,キャッシュが原因でないか確認してみる(そもそもパスが通ってない等はまた別問題).
- Bashのキャッシュを確認
$ hash
- Bashのキャッシュを削除
$ hash -r
以下は自分がハマった経緯なので,興味のある方だけどうぞ.
何があったか
ansibleで遊んでいたところ,使っているpythonのバージョンが2系のままだったので,入れ直して3系にすることにしました.
古いバージョンの削除,新しいバージョンのインストールまでは成功したものの,バージョンを確認しようとしたところ...
$ ansible-playbook --version
-bash: /usr/bin/ansible-playbook: そのようなファイルやディレクトリはありません
???
ファイルが存在しない...
なお,ansible本体のバージョンを確認してみると
$ ansible --version
ansible 2.9.7
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/vagrant/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.6/site-packages/ansible
executable location = /usr/local/bin/ansible
python version = 3.6.8 (default, Apr 2 2020, 13:34:55) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
実行できる.
各コマンドのパスを確認してみると
$ which ansible
/usr/local/bin/ansible
$ which ansible-playbook
/usr/local/bin/ansible-playbook
同じパスにあるのに,ansible
は実行できてansible-playbook
は別のパスを参照して実行できない...
この時点で自分はキャッシュの存在に気付いておらず,「パスの優先順位の問題か?でもコマンド毎に変わるのはおかしいのでは?」等,かなり迷走しました.
その後,あるサイトで見た状況が上記とほぼ同じだったため,試しにキャッシュを確認したところ,
$ hash
hits command
5 /usr/local/bin/ansible
25 /usr/bin/ansible-playbook
...
ansible
は/usr/local/bin
,ansible-playbook
は/usr/bin
としてキャッシュされており,異なるパスを参照していることが分かりました.
キャッシュをhash -r
で削除し,再度コマンドを確認すると,
$ ansible-playbook --version
ansible-playbook 2.9.7
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/vagrant/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.6/site-packages/ansible
executable location = /usr/local/bin/ansible-playbook
python version = 3.6.8 (default, Apr 2 2020, 13:34:55) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
無事に実行できました.
まとめ
結果的にはいくつかのサイトを見て回ってキャッシュが原因ということが分かったものの,こういう機会でもないと全く意識しない上にすぐ忘れそうだなと思い,簡単にまとめました.
コマンドは同じものをよく実行するため,言われてみればキャッシュを活かしやすいなとは思いつつ,ハマると厄介だということも再認識しました(個人的に,ブラウザ等のキャッシュにもよくハマる).
最後まで読んで頂きありがとうございました.