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