0

我编译了一个名为 main.c 的愚蠢的“hello world”C 程序:

gcc main.c

正如预期的那样,出现了一个名为 a.out 的文件,他们说这是一个可执行文件。从同一个目录,如果我输入

a.out

然后按回车,它说“找不到命令”。但是如果我输入

./a.out

它根据需要说“你好世界”。我从未见过需要在其前面运行“./”的可执行文件。为什么现在?

4

5 回答 5

2

所有不在您中的可执行文件都PATH需要来自根目录/或本地目录的显式路径./才能运行。快速搜索会发现具有基本相同问题的其他线程:

为什么在脚本名称之前需要 ./(点斜杠)才能在 bash 中运行它?

这还具有帮助您在 shell 中自动完成的额外好处(假设它支持它)。如果您键入aTabTab,它将列出路径中以“a”开头的每个可执行文件。但是,如果您键入./aTab它可能会自动完成,a.out因为它只会查看当前目录中以“a”开头的可执行文件。所以,这样看,“./”实际上节省了你输入几个键的时间!

于 2013-06-28T23:25:18.977 回答
0

这是因为系统正在寻找 a.out 或任何其他 exec。文件在一些特殊的路径。默认情况下(通常),当前目录不在该列表中。

查看此类路径的列表:

$ env|grep PATH

您可以将此类当前目录添加到 PATH 环境中。多变的:

$ export PATH=$PATH:.

但是你最好避免这样做并运行./a.out。这样的技术。让我们了解我们正在从当前目录运行指定文件,而不是从另一个(可能)目录运行具有相同名称的另一个文件。所以,我们确切地知道我们运行的是什么。

于 2013-06-28T23:34:21.967 回答
0

那是因为a.out不在你的$PATH.
您提供的命令由 shell 在$PATHlinux 中的环境变量)中搜索。

$PATH 基本上是目录列表。当您提供可执行文件名称时,shell 会在由 提供的目录中搜索它$PATH

由于a.out不在您的 中$PATH,因此您必须明确提供 a.out 的路径。

于 2013-06-28T23:24:30.270 回答
0

Unix 和 Linux 的标准做法是不在路径中包含当前工作目录。如果您想要 MSDOS/Windows 行为,请更改您的 PATH 变量以包含.为第一个目录。

于 2013-06-28T23:25:49.947 回答
0

当您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
于 2013-06-28T23:39:19.250 回答