為什麼 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一下就好了。

hash redis-cli

答案2

看起來你有一個別名或一個具有該名稱的 shell 函數;我相信這兩個都會繞過你的 $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

相關內容