我编译了一个名为 main.c 的愚蠢的“hello world”C 程序:
gcc main.c
正如预期的那样,出现了一个名为 a.out 的文件,他们说这是一个可执行文件。从同一个目录,如果我输入
a.out
然后按回车,它说“找不到命令”。但是如果我输入
./a.out
它根据需要说“你好世界”。我从未见过需要在其前面运行“./”的可执行文件。为什么现在?
我编译了一个名为 main.c 的愚蠢的“hello world”C 程序:
gcc main.c
正如预期的那样,出现了一个名为 a.out 的文件,他们说这是一个可执行文件。从同一个目录,如果我输入
a.out
然后按回车,它说“找不到命令”。但是如果我输入
./a.out
它根据需要说“你好世界”。我从未见过需要在其前面运行“./”的可执行文件。为什么现在?
所有不在您中的可执行文件都PATH
需要来自根目录/
或本地目录的显式路径./
才能运行。快速搜索会发现具有基本相同问题的其他线程:
为什么在脚本名称之前需要 ./(点斜杠)才能在 bash 中运行它?
这还具有帮助您在 shell 中自动完成的额外好处(假设它支持它)。如果您键入aTabTab,它将列出路径中以“a”开头的每个可执行文件。但是,如果您键入./aTab它可能会自动完成,a.out
因为它只会查看当前目录中以“a”开头的可执行文件。所以,这样看,“./”实际上节省了你输入几个键的时间!
这是因为系统正在寻找 a.out 或任何其他 exec。文件在一些特殊的路径。默认情况下(通常),当前目录不在该列表中。
查看此类路径的列表:
$ env|grep PATH
您可以将此类当前目录添加到 PATH 环境中。多变的:
$ export PATH=$PATH:.
但是你最好避免这样做并运行./a.out。这样的技术。让我们了解我们正在从当前目录运行指定文件,而不是从另一个(可能)目录运行具有相同名称的另一个文件。所以,我们确切地知道我们运行的是什么。
那是因为a.out
不在你的$PATH
.
您提供的命令由 shell 在$PATH
(linux 中的环境变量)中搜索。
$PATH 基本上是目录列表。当您提供可执行文件名称时,shell 会在由 提供的目录中搜索它$PATH
。
由于a.out
不在您的 中$PATH
,因此您必须明确提供 a.out 的路径。
Unix 和 Linux 的标准做法是不在路径中包含当前工作目录。如果您想要 MSDOS/Windows 行为,请更改您的 PATH 变量以包含.
为第一个目录。
当您a.out
在 Linux 终端中键入类似内容时,您暗示您要运行一个名为a.out
. 默认情况下,终端不会在当前目录中查找这些命令,它会查找PATH
- 一组可执行程序的目录。通常是这些目录:
/bin
/usr/bin
/usr/local/bin
echo $PATH
)您必须指定directory
程序的目录才能运行,如果它不在PATH
. 例如:
./a.out
有效,因为.
指的是您所在的目录../a.out
如果a.out
在父目录(..
指父)目录中,则可以工作projectdir/a.out
也可以,如果您的程序在子目录中,projectdir