2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Bashのキャッシュでハマった話

Posted at

こんにちは,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/binansible-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)]

無事に実行できました.

まとめ

結果的にはいくつかのサイトを見て回ってキャッシュが原因ということが分かったものの,こういう機会でもないと全く意識しない上にすぐ忘れそうだなと思い,簡単にまとめました.
コマンドは同じものをよく実行するため,言われてみればキャッシュを活かしやすいなとは思いつつ,ハマると厄介だということも再認識しました(個人的に,ブラウザ等のキャッシュにもよくハマる).

最後まで読んで頂きありがとうございました.

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?