我的程序无法运行,出现了“命令未找到”的错误。

我刚从Windows转到Ubuntu 11.10。
我用文本编辑器编写了以下C代码,并将其保存为Documents中的HelloWorld.c。
#include <stdio.h>
int main()
{
    printf("Hello World!\n");
    return 0;
}

我打开了终端并输入了以下命令:
cd Documents

gcc HelloWorld.c

一个叫做a.out的文件,在谷歌上搜索了一下,是可执行文件。我输入了这个命令:
a.out

但是我明白
a.out: command not found

我做错了哪一步?

不要忘记将其设置为可执行文件,使用 sudo chmod 777 a.out - Nick Shvelidze
@NickShvelidze 编译器通常会为您设置+x权限,您不需要对编译器生成的可执行文件进行chmod操作。唯一常见的情况是,如果gcc在不支持或禁止的文件系统中创建文件,则它可能无法设置可执行权限(在这种情况下,之后立即执行chmod也会失败)。此外,请避免使用777权限。没有必要将文件对所有用户设置为可读、可写和可执行;如果确实需要运行chmod命令,则执行chmod +x a.out即可。 - Eliah Kagan
3个回答

由于您在当前工作目录中运行可执行文件,您应该在其前面加上./。因此,对于您的程序,请将其运行为./a.out

解释

终端在$PATH中搜索可执行文件。这是一个Unix 环境变量,列出了包含系统二进制文件(如lsechogcc)的目录。如果调用的可执行文件不在$PATH目录中(比如a.out),您需要指明它在文件系统中的绝对路径。

在终端中,.是当前工作目录的同义词,因此是./a.out。您也可以使用/home/yihang/Documents/a.out来调用。


2进一步阐述,"./" 作为一个“就在这里”的命令。它有点多余,但在你知道你将执行某些操作时非常有用。 - Ruben Bakker
1你可能还需要执行chmod u+x a.out来允许系统执行它。 - charlesbridge
现在我明白了,使用"./"就可以了。程序在没有进行chmod的情况下也能正常运行。谢谢。 - yihangho
1@yihang:请考虑将此问题标记为已回答,方法是点击您最喜欢的答案左侧的灰色/绿色圆圈。 - Rafał Cieślak
1@Ruben Bakker:实际上,这一点根本不多余。与Windows不同,Linux不会默认在当前目录或默认目录中查找。所以,如果不在路径中,你需要指定目录,无论它是什么。 - Marty Fried

当你在Linux上运行命令时,它会搜索在“PATH”环境变量中列出的所有目录,如果没有找到命令,你就会看到你所见到的那条消息。
通常情况下,它的样子是这样的:
PATH=/usr/local/bin:/usr/bin:/bin

这意味着它首先会在/usr/local/bin目录中查找。如果在那里找不到,它会继续在/usr/bin目录中查找,依此类推。
实际上,在DOS/Windows系统中也有一个叫做%PATH%的变量,功能完全相同。
不同之处在于,在Windows系统中,当前目录也会被搜索。Unix系统认为这是不好的,因为本地文件(如恶意软件)可能会意外覆盖重要的系统程序。
不过,如果你喜欢这种方式,你可以通过将"."添加到路径中来使Linux系统工作方式相同。
PATH=.:$PATH

(这意味着将 PATH 设置为 .: 加上现有的 $PATH 内容。)

最终看起来是这样的(在您的机器上可能会有所不同):

PATH=.:/usr/local/bin:/usr/bin:/bin

如果你不想这样做,你可以通过明确指定目录来运行每个程序。
./myprog

或者

/home/username/myprog

2如果您将添加到PATH中,请始终将其添加到最后。 - muru

基本上,a.out是默认创建的,因为您没有为可执行文件指定名称。请尝试使用以下命令:
gcc HelloWorld.c -o HelloWorld

一旦你这样做了,你应该能够按照(正如Sunil建议的那样)在"HelloWorld"前加上一个点斜杠(./)来调用它。
./HelloWorld

这是一篇解释为什么会创建 a.out 文件的文章链接:在 Linux 上编写和编译 C 程序