Не удается запустить программу C: "a.out: команда не найдена"

Я написал свою первую программу на C. Я скомпилировал ее, и она поместила файл на рабочий стол под названием a.out (поскольку прочитанная мной книга сказала мне, что это должно), но когда я набираю команду a.out в терминал и запустите его, он говорит -bash: a.out: command not found. Почему это так?

Согласно книге "Программирование на C" Стивена Кочана, я делаю правильно, потому что я вхожу в правильный каталог (рабочий стол), я считаю. Он также говорит, что если файл не находится в правильном пути, я могу либо добавить его в путь, либо запустить ./a.out, этот метод работает и запускает программу, почему это?

Ответ 1

Когда вы вводите имя команды (a.out ничем не отличается от любого другого имени команды в этом отношении), оболочка ищет исполняемый файл с этим именем. Он выполняет этот поиск, используя список имен каталогов, хранящихся в переменной среды $PATH.

Вы можете увидеть свой текущий $PATH, набрав

echo $PATH

в командной строке. Типичным значением может быть что-то вроде

/usr/bin:/bin

хотя у вас, вероятно, будут и дополнительные каталоги.

Поскольку a.out находится в вашем текущем рабочем каталоге (введите pwd, чтобы увидеть, что это за каталог), а вашего текущего рабочего каталога, вероятно, нет в вашем $PATH, вы не можете выполнить его, просто набрав a.out.

Поскольку вы можете ссылаться на свой текущий каталог как ., вы можете (и должны) выполнить команду, набрав

./a.out

ПРИМЕЧАНИЕ: у вас может быть . в вашем $PATH, но это считается плохой идеей, так как делает слишком случайным выполнение случайных команд. Если . находится в передней части вашего $PATH, представьте, что я прошу вас cd в мой каталог и введите ls - но я установил файл с именем ls, который делает что-то неприятное. Помещение . в конце вашего $PATH снижает этот риск, но не устраняет его полностью. Лучше всего выработать привычку добавлять имя файла к ./, если вы хотите выполнить его из текущего каталога.

(Я проигнорировал тот факт, что псевдонимы, функции и встроенные команды оболочки также могут выполняться таким образом.)

Ответ 2

Вам нужно ввести ./a.out. Это ./ сообщает bash искать файл a.out в текущем каталоге (точка - . - указывает на текущий каталог).

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