Mein Programm kann nicht mit dem Fehler "Befehl nicht gefunden" ausgeführt werden

15

Ich bin gerade von Windows auf Ubuntu 11.10 umgestiegen.

Ich habe den folgenden Code in C mit dem Texteditor geschrieben und ihn als HelloWorld.c in Documents gespeichert.

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

Und ich habe das Terminal gestartet und die folgenden Befehle eingegeben:

cd Documents

gcc HelloWorld.c

Eine Datei mit dem Namen a.out, die nach einer Suche bei Google die ausführbare Datei ist. Ich habe diesen Befehl eingegeben:

a.out

Aber ich verstehe

a.out: command not found

Welchen Schritt habe ich falsch gemacht?

yihangho
quelle
Vergessen Sie nicht, es ausführbar zu machen, verwenden Siesudo chmod 777 a.out
Nick Shvelidze
@ NickShvelidze Compiler so ziemlich immer +xfür Sie eingestellt; Sie müssen nicht auf chmoddie von einem Compiler erstellte ausführbare Datei. Die einzige häufige Situation gcc, in der es nicht ausführbar ist, besteht darin, dass die Datei in einem Dateisystem erstellt wird, das sie nicht unterstützt oder nicht zulässt (in diesem Fall chmodwürde es auch unmittelbar danach fehlschlagen). Auch 777sollte vermieden werden. Es ist nicht erforderlich, es für alle Benutzer lesbar, beschreibbar und ausführbar zu machen. wenn es waren notwendig zu laufen chmod, dann chmod +x a.outwürde ausreichen.
Eliah Kagan

Antworten:

33

Da Sie eine ausführbare Datei im aktuellen Arbeitsverzeichnis ausführen, sollten Sie ihr ein Präfix voranstellen ./. Also für dein Programm laufe es als ./a.out.

Erläuterung

Das Terminal sucht nach ausführbaren Dateien in $PATH. Dies ist ein Unix variablen Umgebung , dass die Listen Verzeichnisse enthalten Systembinärdateien (wie zum Beispiel ls, echo, oder gcc). Wenn Sie eine ausführbare Datei aufrufen, die sich nicht in einem $PATHVerzeichnis befindet (z. B. a.out), müssen Sie den absoluten Pfad im Dateisystem angeben.

Im Terminal .steht also ein Synonym für das aktuelle Arbeitsverzeichnis ./a.out. Sie könnten genauso gut anrufen /home/yihang/Documents/a.out.

0x0
quelle
1
Um dies näher zu erläutern, dient das "./" als "genau hier" -Befehl. Es ist ein bisschen redundant, aber nützlich in dem Sinne, dass Sie wissen, dass Sie etwas ausführen werden.
Ruben Bakker
1
Möglicherweise müssen Sie chmod u+x a.outdem System auch erlauben, es auszuführen.
Charlesbridge
Jetzt verstehe ich es mit "./". Das Programm läuft einwandfrei ohne chmod. Vielen Dank.
Yihangho
1
@yihang: Bitte markieren Sie diese Frage als beantwortet, indem Sie auf den grau / grünen Kreis links neben der Antwort klicken, die Ihnen am besten gefällt.
Rafał Cieślak
@Ruben Bakker: Eigentlich ist es gar nicht überflüssig. Im Gegensatz zu Windows sucht Linux nicht standardmäßig im aktuellen oder Standardverzeichnis. Wenn es sich also nicht im Pfad befindet, müssen Sie das Verzeichnis angeben, unabhängig davon, was es ist.
Marty Fried
9

Wenn Sie Befehle unter Linux ausführen, werden alle in der PATHUmgebungsvariablen aufgelisteten Verzeichnisse durchsucht. Wenn der Befehl dort nicht gefunden wird, erhalten Sie die Meldung, die Sie gesehen haben.

Normalerweise sieht es so aus:

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

Das heißt, es wird zuerst in aussehen /usr/local/bin. Wenn es es dort nicht findet, schaut es hinein /usr/binund so weiter.

Tatsächlich ist dies unter DOS / Windows sehr ähnlich: Es gibt eine Variable namens %PATH%, die genau dasselbe tut.

Der Unterschied besteht darin, dass unter Windows auch das aktuelle Verzeichnis durchsucht wird. Unix hält dies für schlecht, da eine lokale Datei (wie Malware) versehentlich wichtige Systemprogramme außer Kraft setzen kann.

Wenn Sie dies jedoch vorziehen, können Sie Linux auf die gleiche Weise .zum Laufen bringen, indem Sie Folgendes zum Pfad hinzufügen :

PATH=.:$PATH

(Das sagt Satz PATHauf .:und die vorhandenen Inhalte $PATH.)

Es sieht ungefähr so ​​aus (es kann auf Ihrem Computer anders sein):

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

Wenn Sie das nicht möchten, können Sie einfach jedes Programm ausführen, indem Sie das Verzeichnis explizit angeben:

./myprog

oder

/home/username/myprog
ams
quelle
2
Wenn Sie hinzufügen .zu PATH, immer fügen Sie es zuletzt.
muru
3

Im Wesentlichen wird das a.out standardmäßig erstellt, da Sie keinen Namen für die ausführbare Datei angegeben haben. Versuchen Sie dies stattdessen:

gcc HelloWorld.c -o HelloWorld

Sobald Sie das getan haben, sollten Sie in der Lage sein, es aufzurufen, indem Sie (wie Sunil vorgeschlagen hat) "HelloWorld" mit einem Punkt-Schrägstrich (./) voranstellen:

./HelloWorld

Hier ist ein Link zu einem Artikel, der ein wenig erklärt, warum das a.out erstellt wird: Schreiben und Kompilieren von C-Programmen unter Linux .

Aaron
quelle