Ubuntu が $PATH 変数内の正しいディレクトリをチェックしないのはなぜですか?

Ubuntu が $PATH 変数内の正しいディレクトリをチェックしないのはなぜですか?

プログラムを実行しようとしていますredis-cli

$ ls -lh /usr/local/bin/ | grep redis
-rwxr-xr-x 1 root root 4.2M Mar 24 19:49 redis-cli
-rwxr-xr-x 1 root root 5.6M Mar 24 19:49 redis-server

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

プログラムがredis-cliディレクトリ内に存在し/usr/local/bin、そのディレクトリがパス変数内にある場合、なぜ次のエラーが発生するのでしょうか?

$ redis-cli
-bash: /usr/bin/redis-cli: No such file or directory

編集

$ /usr/local/bin/redis-cli
redis 127.0.0.1:6379>

$ redis-cli
-bash: /usr/bin/redis-cli: No such file or directory

$ file /usr/local/bin/redis-cli
/usr/local/bin/redis-cli: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x3715af7983c534d902d8dc627f9b0f1b4c8b8e80, not stripped

答え1

おそらく、/usr/bin/redis-cli に redis-cli があったが、現在は削除されている可能性があります。

Bash は、更新されていない実行可能ファイルの内部ハッシュをパス上に保持します。この問題が再度発生した場合は、ハッシュを再度実行すると機能します。

hash redis-cli

答え2

どうやら、その名前のエイリアスまたはシェル関数があるようです。これらは両方とも $PATH をバイパスし、「which」から隠されると思います。

エイリアスを確認するには:

alias redis-cli

エイリアスが見つかった場合にそれを削除するには:

unalias redis-cli

関数を確認するには:

declare -f redis-cli

関数が見つかった場合にそれを削除するには:

unset -f redis-cli

これらのいずれかが問題であることが判明した場合、それらのコマンドはターミナル セッションの終了までしか役に立ちません。次回は再度実行する必要があります。.bashrc と .profile をチェックして、redis-cli に言及している不正なコマンドがないか確認する必要があります。それでも問題が解決しない場合は、/etc のどこかにある可能性があります。

grep redis-cli /etc

関連情報