bashでパスが通っているのにコマンドが見つからない(または、パスの順序と違うコマンドが実行される)場合の原因と対応

投稿者: | 2017年12月23日

はじめに

コマンドの格納場所をパスの通った別の場所へ変更したり、もともとインストールされていたコマンドと同名のコマンドをインストールしてPATH環境変数で新しい方が先に見つかるように設定しても、目的のコマンドが実行できない場合があります。

whichコマンドで目的のコマンドのパスが確認でき、絶対パスで実行できるならばコマンドのキャッシュが影響している可能性があります。

原因

bashはPATH環境変数から検索して実行したコマンドのパスをキャッシュしています。

現在のキャッシュはhashコマンドで確認できます。

ringo@stupiddog  $ hash
hits	command
   1	/usr/bin/which
   4	/usr/local/bin/ctags
   2	/usr/local/bin/stags
   1	/bin/mv
   1	/usr/bin/man
   8	/bin/ls

PATH環境変数より先にキャッシュが参照されるため、正しくパスが通っていても間違ったコマンドが実行されます。このキャッシュはコマンドの存在確認はしていないので、コマンドが移動していると存在しないパスを返してきます。

ringo@stupiddog  $ which ctags
/usr/bin/ctags

ringo@stupiddog  $ ctags
-bash: /usr/local/bin/ctags: No such file or directory

対応

hash -rコマンドによりキャッシュをクリアします。

ringo@stupiddog  $ hash -r

ringo@stupiddog  $ ctags
usage: ctags [-BFadtuwvx] [-f tagsfile] file ...

ringo@stupiddog  $ hash
hits	command
   1	/usr/bin/ctags

まとめ

度々、bashのキャッシュのことを忘れて時間を潰すので覚書です。