Linux
Linux/bash 不執行“which”告訴我的執行檔
觀察: 我有一個名為 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)