2016-03-31 104 views
1

我在PATH中有/ usr/bin,稍後在PATH中有dot(表示當前目錄)。我在兩個目錄中有一個程序'abcxyz',/ var和/ someother。如果我在/ var的配對終端中,鍵入了一個荒謬的名字dgxuznk,那麼bash會說:「bash:dgxuznk:command not found」,就像你期望的那樣。如果我現在在/ usr/bin中創建一個名爲dgxuznk的鏈接,指向/中的程序,它也運行該程序,同樣如您所期望的那樣。但是,如果我現在刪除該鏈接,它不再說「找不到命令」,而是「bash:/ usr/bin/dgxuznk:沒有這樣的文件或目錄」。就好像它記住了它以前找到它的位置,並且期望再次在/ usr/bin下找到它。更糟糕的是,如果我現在將程序在/ var(我在哪裏)重命名爲dgxuznk,並鍵入「dgxuznk」,它仍然抱怨「bash:/ usr/bin/dgxuznk:沒有這樣的文件或目錄」如果無法通過PATH中的/ usr/bin查看該點並查看當前目錄中的程序。如何停止Linux中止PATH搜索?

這是隻在Fedora 19?我怎樣編程才能通過搜索路徑中的/ usr/bin並找到當前目錄點?

(提示:如果您想重現此錯誤 - 不讓它找到當前目錄下的程序,直到後它發現它在/ usr/bin中)

+1

不要把'.'放在'$ PATH'中。這是一個等待發生的安全問題。 –

回答

6

bash保持在內存中的散列在哪裏找到程序,以便每次運行命令時都不必經過完整路徑查找。每個bash會話都維護自己的散列,但您可以使用內置的hash命令來操作它。要查看散列中的內容,只需在沒有參數的情況下運行它。要清除它,請使用hash -r。在你的情況下,你只是想刪除dgxuznkhash -d gdxuznk

(您可能會問,爲什麼bash不只是從哈希中刪除一個條目,如果找不到該位置,可能是報告錯誤而不是退回到路徑查找的好理由,或者它可能是一個缺陷或需要改進的地方。)

+0

非常感謝chepner。我不知道'哈希'存在。但這無異於譁變!有沒有辦法,它應該放棄執行一個程序,如果它在PATH列表中。並且這是不正確的操作,因爲用戶可以專門設置PATH中的目錄的ORDER以選擇正確的目錄。這個散列的東西會擊敗那個。還有,當它出現在列表中時,就說它找不到一個程序!我大吃一驚!有沒有辦法把它關掉? – Clive

+0

我不認爲你可以禁用它,但是你可以在每次改變PATH時用'hash -r'清除它。然而,'PATH'並不是你通常在bash會話期間經常需要改變的東西。 – chepner