web-dev-qa-db-fra.com

Mon programme ne peut pas s'exécuter avec l'erreur "commande introuvable"

Je viens de passer de Windows à Ubuntu 11.10.

J'ai écrit le code suivant en C avec l'éditeur de texte et l'ai enregistré sous HelloWorld.c dans Documents.

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

Et j'ai démarré le terminal et entrez les commandes suivantes:

cd Documents

gcc HelloWorld.c

Un fichier appelé a.out, qui, après quelques recherches sur Google, est l'exécutable. J'ai entré cette commande:

a.out

Mais je reçois

a.out: command not found

Quelle étape ai-je mal fait?

16
yihangho

Puisque vous exécutez un fichier exécutable dans le répertoire de travail en cours, vous devez le préfixer avec ./. Donc, pour votre programme, exécutez-le en tant que ./a.out.

Explication

Le terminal recherche les exécutables dans $PATH. Il s'agit d'un Unix variable d'environnement qui répertorie les répertoires contenant les fichiers binaires du système (tels que ls, echo ou __namegcc). Si vous appelez un exécutable qui n'est pas dans un répertoire $PATH (tel que a.out), vous devez indiquer son chemin absolu dans le système de fichiers.

. du terminal est un synonyme du répertoire de travail actuel, donc ./a.out. Vous pouvez également appeler /home/yihang/Documents/a.out.

33
0x0

Lorsque vous exécutez des commandes sous Linux, il recherche tous les répertoires répertoriés dans la variable d'environnement PATH. S'il ne trouve pas la commande à cet emplacement, vous obtenez le message que vous avez vu.

Typiquement cela ressemble à ceci:

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

Cela signifie qu'il va d'abord regarder dans /usr/local/bin. S'il ne le trouve pas, il regardera dans /usr/bin, et ainsi de suite.

En fait, cela ressemble beaucoup à DOS/Windows: il existe une variable appelée %PATH% qui fait exactement la même chose.

La différence est que, sous Windows, le répertoire en cours est également recherché. Unix considère cela comme une mauvaise solution car un fichier local (tel qu'un logiciel malveillant) peut écraser accidentellement d'importants programmes système.

Si vous préférez cela, vous pouvez faire fonctionner Linux de la même manière en ajoutant . au chemin:

PATH=.:$PATH

(Cela signifie que vous définissez PATH sur .:, plus le contenu existant de $PATH.)

Cela finit par ressembler à quelque chose comme ça (ça peut être différent sur votre machine):

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

Si vous préférez ne pas le faire, vous pouvez simplement exécuter chaque programme en spécifiant explicitement le répertoire:

./myprog

ou

/home/username/myprog
9
ams

Essentiellement, l'a.out est créé par défaut car vous n'avez pas spécifié de nom pour l'exécutable. Essayez ceci à la place:

gcc HelloWorld.c -o HelloWorld

Une fois que vous avez fait cela, vous devriez pouvoir l'invoquer en (comme suggéré par Sunil) en faisant précéder "HelloWorld" d'un point-slash (./):

./HelloWorld

Voici un lien vers un article qui explique un peu pourquoi le a.out est créé: Ecriture et compilation de programmes C sur Linux .

3
Aaron