Il mio programma non può essere eseguito con errore "comando non trovato"


16

Sono appena passato da Windows a Ubuntu 11.10.

Ho scritto il seguente codice in C con l'editor di testo e l'ho salvato come HelloWorld.c in Documents.

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

E ho avviato il Terminale e ho inserito i seguenti comandi:

cd Documents

gcc HelloWorld.c

Un file chiamato a.out, che, dopo alcune ricerche su Google, è l'eseguibile. Ho inserito questo comando:

a.out

Ma capisco

a.out: command not found

Quale passo ho sbagliato?


Non dimenticare di renderlo eseguibile, usasudo chmod 777 a.out
Nick Shvelidze il

I compilatori @NickShvelidze sono quasi sempre pronti +xper te; non è necessario chmodil file eseguibile prodotto da un compilatore. L'unica situazione comune in cui gccnon riesce a renderlo eseguibile è se sta creando il file in un filesystem che non lo supporta o non lo consente (nel qual caso chmodsubito dopo fallirebbe anche). Inoltre, 777dovrebbe essere evitato. Non è necessario renderlo leggibile, scrivibile ed eseguibile da tutti gli utenti; se fosse necessario eseguire chmod, allora chmod +x a.outsarebbe sufficiente.
Eliah Kagan,

Risposte:


33

Dato che stai eseguendo un eseguibile nella directory di lavoro corrente, dovresti prefissarlo ./. Quindi per il tuo programma eseguilo come ./a.out.

Spiegazione

Il terminale cerca eseguibili in $PATH. Si tratta di un Unix variabile d'ambiente in cui sono elencate le directory che contengono i binari di sistema (come ad esempio ls, echoo gcc). Se chiami un eseguibile che non si trova in una $PATHdirectory (come a.out), devi indicarne il percorso assoluto nel file system.

Nel terminale .è un sinonimo della directory di lavoro corrente, quindi ./a.out. Potresti ugualmente chiamare /home/yihang/Documents/a.out.


1
Per approfondire ulteriormente questo, il comando "./" funge da comando "proprio qui". È un po 'ridondante, ma utile nel senso che sai che eseguirai qualcosa.
Ruben Bakker,

1
Potrebbe anche essere necessario chmod u+x a.outconsentire al sistema di eseguirlo.
Charles

Ora ho capito con "./". Il programma funziona bene senza chmod. Grazie.
Yihangho,

1
@yihang: considera di contrassegnare questa domanda come risposta, facendo clic sul cerchio grigio / verde sul lato sinistro della risposta che ti piace di più.
Rafał Cieślak,

@Ruben Bakker: In realtà, non è affatto ridondante. A differenza di Windows, Linux non cerca per impostazione predefinita nella directory corrente o predefinita. Quindi, se non si trova nel percorso, è necessario specificare la directory, qualunque essa sia.
Marty Fried,

9

Quando esegui comandi su Linux, cerca tutte le directory elencate nella PATHvariabile d'ambiente, e se non trova lì il comando allora ricevi il messaggio che hai visto.

In genere si presenta così:

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

Ciò significa che apparirà per primo /usr/local/bin. Se non lo trova lì cercherà /usr/bin, e così via.

In effetti, questo è molto simile su DOS / Windows: esiste una variabile chiamata %PATH%che fa esattamente la stessa cosa.

La differenza è che, su Windows, viene cercata anche la directory corrente. Unix considera questo male perché un file locale (come malware) può sovrascrivere accidentalmente importanti programmi di sistema.

Se lo preferisci, però, puoi far funzionare Linux allo stesso modo aggiungendo .al percorso:

PATH=.:$PATH

(Che dice impostato PATHsu .:più i contenuti esistenti di $PATH.)

Finisce per assomigliare a questo (potrebbe essere diverso sulla tua macchina):

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

Se preferisci non farlo, puoi semplicemente eseguire ciascun programma specificando esplicitamente la directory:

./myprog

o

/home/username/myprog

2
Se aggiungi .a PATH, sempre aggiungerlo scorso.
Muru,

3

In sostanza, a.out viene creato per impostazione predefinita perché non è stato specificato un nome per l'eseguibile. Prova questo invece:

gcc HelloWorld.c -o HelloWorld

Una volta fatto ciò, dovresti essere in grado di invocarlo (come suggeriva Sunil) sostituendo "HelloWorld" con un punto-barra (./):

./HelloWorld

Ecco un link ad un articolo che spiega un po 'perché viene creato a.out: Scrivere e compilare programmi C su Linux .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.