【问题标题】:Can't run C program: "a.out: command not found"无法运行 C 程序:“a.out:找不到命令”
【发布时间】:2014-05-26 06:48:09
【问题描述】:

我已经用 C 编写了我的第一个程序。我编译了它,它在桌面上放置了一个名为 a.out 的文件(正如我正在阅读的书告诉我的那样),但是当我输入命令 a.out 到终端并运行它说-bash: a.out: command not found。为什么这么说?

根据 Stephen Kochan 的“C 语言编程”一书,我相信我所做的是正确的,因为我在正确的目录(桌面)中。它还说,如果文件不在正确的路径中,我可以将其添加到路径中或运行./a.out,此方法有效并运行程序,这是为什么呢?

【问题讨论】:

  • 这不是c 问题,而是not knowing how bash works 问题。而是调查一下。
  • 那个目录不是“桌面”。它是您当前的工作目录,如果您没有运行 cdpushd 命令,可能是您的主目录。
  • 它说 a.out is not found 因为它不在您的 PATH 中。只需键入./a.out,因为您已经发现了作品。并阅读@AntonH 的建议

标签: terminal sh


【解决方案1】:

当您键入命令名称时(a.out 在这方面与任何其他命令名称没有区别),shell 会搜索具有该名称的可执行文件。它使用存储在$PATH 环境变量中的目录名称列表执行此搜索。

您可以通过键入查看您当前的$PATH

echo $PATH

在您的 shell 提示符下。典型值可能类似于

/usr/bin:/bin

虽然您可能还会有一些额外的目录。

由于a.out 在您的当前工作目录 中(输入pwd 以查看是哪个目录),并且您当前的工作目录可能不在您的$PATH 中,您可以不要只输入a.out 来执行它。

由于您可以将当前目录称为.,因此您可以(并且应该)通过键入来执行命令

./a.out

注意:您可以在您的. 中添加$PATH,但这样做被认为是一个坏主意,因为它很容易意外执行随机命令。如果. 在您的$PATH 的前面,想象一下我要求您将cd 输入到我的目录并输入ls——但我已经安装了一个名为ls 的文件,它做了一些讨厌的事情。将. 放在$PATH末尾 可以减轻这种风险,但并不能完全消除它。如果要从当前目录执行,最好养成在文件名前加上./的习惯。

(我忽略了别名、函数和shell内置命令也可以通过这种方式执行的事实。)

【讨论】:

  • 文件名中不允许使用斜杠。而且我认为您试图在“注释”段落中说其他内容。
  • @Vicrobot:我不明白你的评论。文件名中不允许使用斜杠(和空字符),但文件路径中肯定允许使用斜杠(和空字符)。我在注释中的建议是,如果您在当前目录中有一个名为a.out 的可执行文件,最好通过键入./a.out 来执行它,而不是将. 添加到您的$PATH 中。我的回答不清楚吗?
  • 对不起;我以为您要求文件名以 ./ 开头;我的错。好有答案!!
【解决方案2】:

您需要输入./a.out./ 告诉 bash 在当前目录中查找文件 a.out(点 - . - 指向当前目录)。

如果您在 bash 中键入 a.out,但未指定目录,它将通过 $PATH 变量中的目录搜索它(如果您有兴趣查看这些,请运行 echo $PATH)。因此,您可以告诉它运行当前目录中存在的文件,也可以将当前目录(或桌面目录)添加到$PATH

【讨论】:

  • 这是有道理的,但是如果我在桌面并且文件在桌面上,a.out 不应该工作吗?
  • 不,不应该。如果您键入a.out,bash 将在存储在$PATH env 中的目录中查找它。多变的。桌面通常不在$PATH
  • @Justin:在 Unix 上不行,因为当前目录通常不在搜索路径中。把它放在那里有安全风险。
  • @Justin: DOS/cmd 做到了;许多标准 *nix 设置没有。很容易添加。到 PATH (PATH="$PATH:.")。顺便说一句,将当前目录放在前面,而不是 PATH 的末尾可能会被视为安全风险,因为有人可以将脚本放在名为 ls 的目录中,但会删除您主目录中的所有 jpeg。
  • @Deduplicator 嗯。从昨天开始,这是我最不担心的。我从不拼错任何东西。
猜你喜欢
  • 2020-04-16
  • 1970-01-01
  • 2018-01-08
  • 2019-11-12
  • 2018-11-19
  • 2014-09-27
  • 2012-01-24
  • 1970-01-01
  • 2021-06-22
相关资源
最近更新 更多