存在與我想問的類似的變體,但我找不到確切的問題,所以我會在這裡問。
假設我有一個編譯.c
文件,生成的可執行檔ex
位於/mnt/f/C_F/ex
.我可以很好地從內部執行它,/mnt/f/C_F
但是./ex
如果我想從/mnt/f
比如說(或任何與此相關的目錄)執行它怎麼辦?我不想/mnt/f/C_F/
為此添加到 PATH 中。
我找不到解決方案,我想這是不可能的。請確認這一點。
答案1
使用該檔案的絕對路徑。
/mnt/f/C_F/ex
無論您目前的工作目錄如何,這都應該始終有效。一般來說,出於這個原因,您可能應該更喜歡腳本中的絕對路徑(儘管有重要的例外)。
答案2
您始終可以使用可執行檔的相對路徑或完整路徑
當您進入 時/mnt/f
,您可以運行:
C_F/ex
# or
/mnt/f/C_F/ex
答案3
任何小路1至包含至少一個/
作品的可執行檔。命令名稱中存在的/
字元告訴 shell 您正在要求它運行特定文件,並且您正在指定要找到該文件的特定位置。這是 shell 期望的語法的一部分;在大多數其他上下文中,(相對)路徑不包含字元是可以接受的/
。
對於不在目前目錄中的可執行文件,那是任何通往它的道路。如果不使用至少一個/
.這使得在其他目錄中運行檔案變得更簡單,儘管它不太熟悉。
絕對路徑- 喜歡
/mnt/f/C_F/ex
- 從...開始/
。相對路徑到另一個目錄中的檔案--
C_F/ex
當您在目錄中時/mnt/f
- 始終包含 a/
,即使它不在開頭。不帶 a 的相對路徑/
只是一個檔案名,標識目前目錄中的檔案。 (但反之則不然。相對路徑可能包含/
但仍引用目前目錄中的文件;請參見下文。)請注意,相對路徑如果要起作用,仍然必須實際引用您想要的文件,並且無論相對路徑是否引用您想要的文件取決於您目前所在的目錄,因為它們是相對於當前目錄解析的。
對於一個可執行檔是在當前目錄中,最短相對路徑通常不起作用,因為它不包含/
.因此,這是一個更複雜的情況,儘管它更熟悉。當您位於執行檔所在的目錄中時ex
,您不能只執行ex
,即使ex
是該執行檔的完美相對路徑。
它不起作用的原因是不包含 a 的命令名稱/
不會被視為相對路徑或任何路徑。反而,它被視為文件名並進行搜索在 中列出的目錄中$PATH
。2
這就是./ex
當您與 位於同一目錄中時使用的原因ex
。每個目錄都包含一個.
引用該目錄本身的條目。這提供了一種方法編寫一個相對路徑,該相對路徑標識相同的文件,ex
但其中包含/
,因此可用作 shell 視為路徑的命令名稱。
因此,前綴./
並不是一種特殊的語法,而只是在當前目錄中寫入文件相對路徑的第二簡單方法,也是包含/
.
1在這個答案中,我使用「路徑」來表示「路徑名」。這是「路徑」最常見的用法,但不是唯一的用法。我在這裡使用的術語“路徑”不應與可執行搜尋路徑,這是列出其路徑的目錄的集合,以:
字元分隔,在$PATH
環境變數中。
2不包含 a 的命令名稱/
也可能被解析為非外部命令,例如 shell 內建命令和 shell 函數。