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

14

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 saisis 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?

yihangho
la source
N'oubliez pas de le rendre exécutable, utilisezsudo chmod 777 a.out
Nick Shvelidze
@NickShvelidze Compilers est presque toujours défini +xpour vous; vous n'avez pas besoin de chmodl'exécutable produit par un compilateur. La seule situation courante où gccne parvient pas à le rendre exécutable est s'il crée le fichier dans un système de fichiers qui ne le prend pas en charge ou ne le permet pas (auquel cas, chmodimmédiatement après, échouerait également). Aussi, 777devrait être évité. Il n'est pas nécessaire de le rendre lisible, inscriptible et exécutable par tous les utilisateurs; si elle était nécessaire d'exécuter chmod, alors chmod +x a.outserait suffisant.
Eliah Kagan

Réponses:

33

Puisque vous exécutez un exécutable dans le répertoire de travail actuel, 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. Ceci est un Unix variable d'environnement que les répertoires contenant des listes binaires du système ( par exemple ls, echoou gcc). Si vous appelez un exécutable qui ne se trouve pas dans un $PATHrépertoire (tel que a.out), vous devez indiquer son chemin absolu dans le système de fichiers.

Dans le terminal .est donc synonyme du répertoire de travail actuel ./a.out. Vous pourriez tout aussi bien appeler /home/yihang/Documents/a.out.

0x0
la source
1
Pour approfondir cela, le "./" sert de commande "ici". C'est un peu redondant, mais utile dans le sens où vous savez que vous allez exécuter quelque chose.
Ruben Bakker
1
Vous devrez peut-être également chmod u+x a.outautoriser le système à l'exécuter.
charlesbridge
Maintenant je l'obtiens avec "./". Le programme fonctionne correctement sans chmod. Merci.
yihangho
1
@yihang: Veuillez considérer de marquer cette question comme ayant été répondue, en cliquant sur le cercle gris / vert sur le côté gauche de la réponse que vous aimez le plus.
Rafał Cieślak
@Ruben Bakker: En fait, ce n'est pas du tout redondant. Contrairement à Windows, Linux ne recherche pas par défaut dans le répertoire actuel ou par défaut. Donc, s'il n'est pas dans le chemin, vous devez spécifier le répertoire, quel qu'il soit.
Marty Fried
9

Lorsque vous exécutez des commandes sous Linux, il recherche tous les répertoires répertoriés dans la PATHvariable d'environnement, et s'il n'y trouve pas la commande, vous obtenez le message que vous avez vu.

Cela ressemble généralement à ceci:

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

Cela signifie qu'il apparaîtra en premier /usr/local/bin. S'il ne le trouve pas, il le cherchera /usr/bin, et ainsi de suite.

En fait, c'est très similaire sous DOS / Windows: il y a une variable appelée %PATH%qui fait exactement la même chose.

La différence est que, sous Windows, le répertoire actuel est également recherché. Unix considère cela comme mauvais car un fichier local (tel qu'un malware) peut remplacer accidentellement des programmes système importants.

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 l'ensemble PATHdoit .:contenir le contenu existant de $PATH.)

Cela finit par ressembler à quelque chose comme ça (cela 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
ams
la source
2
Si vous ajoutez .à PATH, ajoutez-le toujours en dernier.
muru
3

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

gcc HelloWorld.c -o HelloWorld

Une fois que vous avez fait cela, vous devriez pouvoir l'invoquer en (comme l'a suggéré Sunil) en faisant précéder "HelloWorld" d'une barre oblique (./):

./HelloWorld

Voici un lien vers un article qui explique un peu pourquoi la création de a.out: Écriture et compilation de programmes C sous Linux .

Aaron
la source