2011-08-27 27 views
0

有時,當我調試一個從命令行運行的程序時,一個看似明顯的變化在我關閉終端窗口,打開一個新窗口並重試之前不起作用。我在Mac OS(即bash)和Windows上都發生過這種情況。爲什麼關閉終端窗口並打開一個新窗口有時候是解決方案?

這是我明智的解決方案失敗時做的最後一件事,但我想知道爲什麼。這是關於命令行程序「捕獲」創建時的快照的東西嗎?

+0

我不確定,但它可能與記住命令名引用的可執行文件有關,如果你一直使用'/ usr/bin/foo',然後創建'/ usr/local/bin/foo',shell可能看不到後者。 (儘管我覺得這不是它)。 – Owen

+0

'hash -r'對Bash來說是一個不那麼激烈的修復。 – tripleee

回答

1

殼可以哈希已知的二進制文件(這樣他們就不必搜索路徑它)

當改變全系統的環境變量,你需要開始一個新的外殼,以獲得新的環境。請注意,僅當輸入子shell不起作用,因爲子進程從父母繼承其環境

+0

有人可以擴展「殼可以散列已知的二進制文件」嗎?我知道哈希是什麼;當某個命令即將被執行時,它會以某種方式被使用嗎? –

+0

_當改變系統範圍的環境變量時,你需要啓動一個新的shell來獲得新的環境._好的,那正是我的想法。任何人都可以說更多**爲什麼**你需要啓動一個新的shell?是否有一個原因,爲什麼shell _不能意識到所有環境變量的當前狀態?謝謝。 –

+1

@Gregg:部分只是根據定義; UNIX有這樣一個悠久的傳統。它的主要用途是安全性:防止對環境的操縱,以防止損害PATH/LIBPATH/LD_LIBRARY_PATH等,這些可用於獲取不可信的代碼來執行。通過擴展,它可以隔離進程:某些進程將需要一個自定義的PATH等,如果子進程以某種方式從「新的全局環境」啓動,他們根本無法正常工作,因爲它們依賴於父進程的相同環境, – sehe

相關問題