如果我有一個名為 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
。