存在与我想问的类似的变体,但我找不到确切的问题,所以我会在这里问。
假设我有一个编译.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
目录中时 - 始终包含/
,即使它不在开头。没有 的相对路径/
只是一个文件名,用于标识当前目录中的文件。(但反之则不然。相对路径可能包含 ,/
但仍引用当前目录中的文件;见下文。)请注意,如果要使相对路径正常工作,它仍然必须实际引用您想要的文件,并且无论相对路径是否引用您想要的文件取决于你当前所在的目录,因为它们是相对于当前目录解析的。
对于可执行文件是在当前目录中,最短相对路径通常不起作用,因为它不包含/
。因此,这是更复杂的情况,尽管它更常见。当您在可执行文件所在的目录中时ex
,您不能直接运行ex
,即使ex
是该可执行文件的完美相对路径。
它不起作用的原因是,不包含的命令名称/
不被视为相对路径或任何路径。相反,它被视为文件名并被搜索在列出的目录中$PATH
。2
这就是为什么./ex
当您与 位于同一目录中时使用 的原因ex
。每个目录都包含一个.
指向目录本身的条目。这提供了一种方法编写一个相对路径,该路径标识与相同的文件,ex
但其中包含/
,因此可用作 shell 视为路径的命令名。
因此,前缀./
不是一种特殊的语法,而只是在当前目录中写入文件的相对路径的第二简单的方法,也是包含 . 的方法中最简单的方法/
。
1在本回答中,我使用“path”来表示“pathname”。这是“path”最常见的用法,但不是唯一用法。我在这里使用的“path”一词不应与可执行文件搜索路径,它是列出其路径的目录集合,以:
字符分隔,在$PATH
环境变量中。
2不包含的命令名/
也可能被解析为非外部命令,例如 shell 内置命令和 shell 函数。