Linux

Linux/bash 不執行“which”告訴我的執行檔

  • June 26, 2017

觀察: 我有一個名為 foo 的執行檔,位於 /b/foo 中。它是針對動態庫的舊標頭檔編譯的,導致它在執行時出現段錯誤:

$ foo
Segmentation fault. // Expected behaviour.

現在,我針對應該可以正常執行的新動態庫將新版本的 foo 編譯到 /a/foo 中。目錄 a/ 在我的 $PATH 中位於 b/ 之前,因此應該選擇 /a/foo:

$ which foo
/a/foo

當我執行 foo 時,會發生以下情況:

$ foo
Segmentation fault.

因此,似乎 /b/foo 被執行了,而“which”告訴我應該執行 /a/foo。為了讓事情變得更奇怪,當我執行完整路徑 $(which /a/foo) 時,一切正常:

$ /a/foo
OK!

$ cp /a/foo .
$ ./foo
OK!

更進一步,如果我現在刪除 /a/foo:

$ rm /a/foo

那麼 /b/foo 肯定會被選中,對吧?

$ which foo
/b/foo
$ foo
bash: /a/foo: No such file or directory
$ $(which foo)
Segmentation fault. // Expected result.

沒有!

修復: 源 .bash_profile 和 .bashrc 並且問題消失了。

再現性: 每次。只需刪除/a/foo,source ~/.bash_profile,創建/a/foo,上述觀察再次出現。

問題: 有人知道這裡出了什麼問題嗎?

假設: “哪個”是最新的,但係統根據“過去是什麼情況”進行選擇。在我上面的範例中,打開終端時 /a/foo 還不存在:我剛剛創建了它。因此,當 /a/foo 創建時,“which”確實檢測到 /a/foo,但係統仍然選擇 /b/foo,因為它不同步? 但是為什麼系統不同步?

Bash 記憶體命令的位置。用於hash foo強制它更新記憶體。

此外,which它是一個單獨的命令,它不會告訴您 shell 實際在哪裡;它只是諮詢$PATH環境變數。在 bash 中,您應該type改用:

$ type foo
foo is hashed (/a/foo)

引用自:https://unix.stackexchange.com/questions/373436