はじめに
コマンドの格納場所をパスの通った別の場所へ変更したり、もともとインストールされていたコマンドと同名のコマンドをインストールして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
のキャッシュのことを忘れて時間を潰すので覚書です。