Моя программа не может работать с ошибкой «команда не найдена»

15

Я только что перешел с Windows на Ubuntu 11.10.

Я написал следующий код на C с помощью текстового редактора и сохранил его как HelloWorld.c в Documents.

#include <stdio.h>
int main()
{
    printf("Hello World!\n");
    return 0;
}

И я запустил Терминал и ввел следующие команды:

cd Documents

gcc HelloWorld.c

Файл с именем a.out, который после некоторого поиска в Google является исполняемым файлом. Я ввел эту команду:

a.out

Но я получаю

a.out: command not found

Какой шаг я сделал неправильно?

yihangho
источник
Не забудьте сделать его исполняемым, используйтеsudo chmod 777 a.out
Ник Швелидзе
@NickShvelidze Компиляторы почти всегда установлены +xдля вас; вам не нужен chmodисполняемый файл, созданный компилятором. Единственная распространенная ситуация, когда gccне удается сделать его исполняемым, - это если он создает файл в файловой системе, которая не поддерживает или не разрешает его (в этом случае chmodсразу же после этого может произойти сбой). Кроме того, 777следует избегать. Нет необходимости делать его читаемым, записываемым и исполняемым всеми пользователями; если это было необходимо для запуска chmod, то chmod +x a.outбудет вполне достаточно.
Элия ​​Каган

Ответы:

33

Поскольку вы запускаете исполняемый файл в текущем рабочем каталоге, вы должны поставить перед ним префикс ./ . Так что для вашей программы запустите его как ./a.out.

объяснение

Терминал ищет исполняемые файлы в $PATH. Это Unix переменная окружения , которые перечислены каталоги , содержащие системные файлы (такие как ls, echoили gcc). Если вы вызываете исполняемый файл, который не находится в $PATHкаталоге (например,a.out ), вам необходимо указать его абсолютный путь в файловой системе.

В терминале .есть синоним текущего рабочего каталога, таким образом ./a.out. Вы могли бы одинаково хорошо позвонить /home/yihang/Documents/a.out.

0x0
источник
1
Чтобы уточнить это, "./" служит командой "прямо здесь". Это немного избыточно, но полезно в том смысле, что вы знаете, что будете что-то выполнять.
Рубен Баккер
1
Вам также может понадобиться chmod u+x a.outразрешить системе выполнить его.
Чарльзбридж
Теперь я получаю это с "./". Программа работает нормально без chmod. Благодарю.
yihangho
1
@yihang: Пожалуйста, пометьте этот вопрос как ответ, щелкнув по серому / зеленому кружку слева от ответа, который вам нравится больше всего.
Rafał Cieślak
@Ruben Bakker: На самом деле, это вовсе не избыточно. В отличие от Windows, Linux по умолчанию не ищет в текущем каталоге или каталоге по умолчанию. Так что, если он не находится в пути, вам нужно указать каталог, какой бы он ни был.
Марти Фрид
9

Когда вы запускаете команды в 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, всегда добавляйте его последним.
Муру
3

По сути, a.out создается по умолчанию, потому что вы не указали имя для исполняемого файла. Попробуйте это вместо этого:

gcc HelloWorld.c -o HelloWorld

После того, как вы это сделаете, вы сможете вызвать его (как предложил Сунил), предварительно указав «HelloWorld» с помощью косой черты (./):

./HelloWorld

Вот ссылка на статью, в которой немного объясняется, почему создается a.out: Написание и компиляция программ на C в Linux .

Аарон
источник