Mój program nie może działać z błędem „komenda nie została znaleziona”

14

Właśnie zmieniłem system Windows na Ubuntu 11.10.

Napisałem następujący kod w C za pomocą edytora tekstu i zapisałem go jako HelloWorld.c w Dokumentach.

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

Uruchomiłem Terminal i wprowadziłem następujące polecenia:

cd Documents

gcc HelloWorld.c

Plik o nazwie a.out, który po pewnym wyszukiwaniu w Google jest plikiem wykonywalnym. Wprowadziłem to polecenie:

a.out

Ale rozumiem

a.out: command not found

Który krok zrobiłem źle?

yihangho
źródło
Nie zapomnij, aby uczynić go wykonywalnym, użyjsudo chmod 777 a.out
Nick Shvelidze
Kompilatory @NickShvelidze prawie zawsze ustawione +xdla Ciebie; nie potrzebujesz chmodpliku wykonywalnego generowanego przez kompilator. Jedyną częstą sytuacją, w której gccnie sprawia, że ​​jest wykonywalny, jest tworzenie pliku w systemie plików, który go nie obsługuje lub na to nie pozwala (w takim przypadku chmodnatychmiast też się nie powiedzie). Ponadto, 777należy unikać. Nie ma potrzeby, aby był czytelny, zapisywalny i wykonywalny przez wszystkich użytkowników; jeśli to było konieczne do uruchomienia chmod, wtedy chmod +x a.outbyłoby wystarczające.
Eliah Kagan

Odpowiedzi:

33

Ponieważ używasz pliku wykonywalnego w bieżącym katalogu roboczym, powinieneś go poprzedzić ./. Więc dla swojego programu uruchom go jako ./a.out.

Wyjaśnienie

Terminal szuka plików wykonywalnych w $PATH. To jest Unix zmienna , która wymienia katalogi zawierające binaria systemowe (takie jak ls, echolub gcc). Jeśli wywołasz plik wykonywalny, który nie znajduje się w $PATHkatalogu (np. a.out), Musisz wskazać jego bezwzględną ścieżkę w systemie plików.

W terminalu .znajduje się zatem synonim bieżącego katalogu roboczego ./a.out. Równie dobrze możesz zadzwonić /home/yihang/Documents/a.out.

0x0
źródło
1
W celu dalszego rozwinięcia tego, „./” służy jako „tutaj”, polecenie. Jest trochę zbędny, ale przydatny w tym sensie, że wiesz, że coś wykonasz.
Ruben Bakker,
1
Może być również konieczne chmod u+x a.outzezwolenie systemowi na wykonanie tego.
charlesbridge,
Teraz rozumiem za pomocą „./”. Program działa poprawnie bez chmod. Dzięki.
yihangho
1
@yihang: Zastanów się nad oznaczeniem tego pytania jako odpowiedzi, klikając szary / zielony okrąg po lewej stronie odpowiedzi, którą lubisz najbardziej.
Rafał Cieślak
@Ruben Bakker: Właściwie to wcale nie jest zbędne. W przeciwieństwie do Windows, Linux nie domyślnie szuka w bieżącym lub domyślnym katalogu. Jeśli więc nie ma go na ścieżce, musisz określić katalog, cokolwiek to jest.
Marty Fried
9

Po uruchomieniu poleceń w systemie Linux przeszukuje wszystkie katalogi wymienione w PATHzmiennej środowiskowej, a jeśli nie znajdzie tam polecenia, pojawia się komunikat, który widziałeś.

Zazwyczaj wygląda to tak:

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

Oznacza to, że najpierw zajrzy /usr/local/bin. Jeśli go tam nie znajdzie, zajrzy /usr/bini tak dalej.

W rzeczywistości jest to bardzo podobne w systemie DOS / Windows: istnieje tak zwana zmienna, %PATH%która robi dokładnie to samo.

Różnicą jest to, że w systemie Windows, bieżący katalog jest również przeszukane. Unix uważa to za złe, ponieważ plik lokalny (np. Złośliwe oprogramowanie) może przypadkowo zastąpić ważne programy systemowe.

Jeśli jednak wolisz, możesz sprawić, aby Linux działał w ten sam sposób, dodając .do ścieżki:

PATH=.:$PATH

(Oznacza to, że ustawiono PATHna .:plus istniejącą zawartość $PATH.)

Wygląda to mniej więcej tak (na twoim komputerze może być inaczej):

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

Jeśli nie chcesz tego robić, możesz po prostu uruchomić każdy program, podając katalog jawnie:

./myprog

lub

/home/username/myprog
ams
źródło
2
Jeśli sumują .się PATH, zawsze dodać, że ostatni.
muru
3

Zasadniczo a.out jest tworzony domyślnie, ponieważ nie określono nazwy pliku wykonywalnego. Spróbuj zamiast tego:

gcc HelloWorld.c -o HelloWorld

Gdy to zrobisz, powinieneś być w stanie wywołać go (zgodnie z sugestią Sunila) poprzedzając „HelloWorld” kropką (./):

./HelloWorld

Oto link do artykułu, który wyjaśnia trochę, dlaczego powstaje a.out: Pisanie i kompilowanie programów C w systemie Linux .

Aaron
źródło