Моя програма не може запускатися з помилкою "команда не знайдена"


14

Я щойно перейшов з Windows на Ubuntu 11.10.

Я написав наступний код на C разом із текстовим редактором і зберег його як HelloWorld.c у Документах.

#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

Який крок я зробив неправильно?


Не забудьте зробити його виконуваним, використовуйте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.


1
Щоб детальніше розібратися з цим, команда "./" служить командою "прямо тут". Це трохи зайве, але корисне в тому сенсі, що ви знаєте, що будете щось виконувати.
Рубен Баккер

1
Можливо, вам також доведеться chmod u+x a.outдозволити системі виконувати його.
Чарльзбридж

Тепер я отримую це з "./". Програма працює нормально без chmod. Спасибі.
ідханго

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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.