執行程式時為什麼要用“./”?

執行程式時為什麼要用“./”?

如果我有一個名為 foo 的程序,為什麼我需要說 ./foo 而不僅僅是 foo? ./ 不是只意味著在目前目錄中嗎?

答案1

當您僅輸入命令時 – 例如。foo– shell(通常bash)只會在某些目錄中尋找它 – 例如 /bin、/usr/bin、/usr/X11R6/bin 等。它通常會不是出於安全考慮,請查看您的“當前目錄”(即“。”)(尤其如果你是)。如果 ”。”已添加,應添加到結尾搜尋路徑。

如果你想運行一個可執行文件不是在此搜尋路徑中,您需要指定命令的完整絕對或相對路徑。例如:

/home/bok/foo   # Absolute in my homedir

~/src/bar  # Shorthand for my homedir and a subdir in it

../Download/foobar  # Relative path – up one step, then down in Download

或者 - 如果命令位於我的當前目錄中 - 只需添加./

./foo

的搜尋路徑bash儲存在小路環境變量,因此您可以透過鍵入以下內容來查看它:

echo $PATH

加上 ”。” – 你真的不應該做 – 輸入:

export PATH="$PATH:."

PATH 是按順序搜尋的,因此如果不同目錄中有多個同名的可執行文件,shell 將執行 PATH 中第一個目錄中的可執行文件。

首先查看所有列出的目錄後,您是否會收到“找不到命令”錯誤。

+++

將當前目錄新增至 PATH 的問題.是,您並不真正知道您可能恰好位於的「非標準」目錄中的可執行檔是否應該執行。

假設我很邪惡,製作了一個破壞性程序,刪除盡可能多的檔案並將其保留在我的主目錄中 - 或者更糟的是,在 /tmp 中......我稱這個程式為sl- 常見的失誤類型ls- 然後等待。

一些隨機用戶位於 /tmp 中,並且拼寫ls錯誤sl。使用正常的 PATH – 沒有 . – 什麼也沒發生,除了他收到「找不到命令」的錯誤。如果他得到‘.’在 PATH 的結尾,那麼他在輸入指令時就不會出現錯誤。相反,我的sl命令將運行,並刪除他擁有的所有檔案。如果他碰巧是,該命令將能夠刪除系統的大部分內容。 (這就是為什麼 真的應該制定規則總是使用完整路徑指令,而不是信任 PATH。

如果他放了“.”首先在他的路徑中,我製作了名為(正確拼寫)的程式ls並將其放入目錄中,那麼它將是我的程式——不是正常的——如果他在該目錄中ls輸入,就會執行該程式。ls因為bash會在目前目錄(.)中尋找第一的– 在檢視具有正版的系統目錄之前ls

相關內容