Commandes

Dans un terminal, si vous voyez une invite (généralement terminée par $), cela signifie que le shell est prêt à recevoir une commande. Vous pouvez alors taper du texte puis valider (en appuyant sur la touche Entrée), et si le texte est bien formé la commande sera interprétée et immédiatement exécutée.

Si le texte est mal formé, vous recevrez un message d'erreur de la part du shell. Si la commande s'exécute mais est incapable d'accomplir ce que vous avez demandé, vous recevrez un message d'erreur de la part du programme correspondant à la commande. Si au contraire tout se passe bien, il est fréquent qu'aucun message n'apparaisse. Dans tous les cas, une fois l'exécution terminée, le shell affiche à nouveau l'invite et attend la prochaine commande.

bob@box:~$ toto
bash: toto: command not found
bob@box:~$ cat toto
cat: toto: No such file or directory
bob@box:~$ echo toto
toto
bob@box:~$

Pour interpréter une commande, le shell la découpe en «mots» (séparés par des espaces). Le premier mot est la commande à exécuter : soit une commande spécifique au shell, soit le nom d'un programme installé sur la machine. Les autres mots sont les arguments de la commande : des informations supplémentaires sur ce que vous voulez faire. Lorsqu'un argument commence par un tiret, il s'agit d'une option. Typiquement, les options servent à modifier le comportement de la commande.

bob@box:tp01$ rm -f toto

Dans cet exemple, la commande est rm (qui sert à supprimer un fichier). Le premier argument est une option : le f indique que nous souhaitons forcer la suppression sans passer par un dialogue de confirmation. Enfin, le deuxième argument indique quel fichier supprimer. Le nombre d'arguments nécessaires ainsi que les options disponibles varient d'un commande à l'autre, c'est pourquoi il est impératif de savoir accéder à la documentation associée (voir plus loin).

Il arrive très souvent qu'une commande doive mentionner un fichier (ou un répertoire). Pour éviter toute ambiguïté, on utilise une notation nommée chemin. Prenons pour exemple une arborescence organisée comme suit :

Pour désigner le fichier cible dans une commande, on peut employer le chemin absolu /home/bob/stuff/cible, ce qui est très précis mais un peu long à taper.

Pour gagner du temps, le shell possède un répertoire courant. Vous pouvez voir le chemin de ce répertoire avec la commande pwd, et vous pouvez le modifier avec la commande cd.

bob@box:~$ pwd
/home/bob/
bob@box:~$ cd /home
bob@box:home$ pwd
/home/

Ce concept permet de construire des chemins relatifs qui montrent comment trouver un fichier depuis le répertoire courant plutôt que depuis la racine. Par exemple, si le répertoire courant est /home/bob, alors le chemin relatif stuff/cible équivaut au chemin absolu /home/bob/stuff/cible. C'est nettement plus court.

Il est facile de reconnaître un chemin relatif parce qu'il ne commence jamais par /. Par contre, il existe des notations spéciales que l'on retrouve souvent au début d'un chemin relatif. Le symbole ~ désigne votre répertoire domicile, le symbole . désigne le répertoire courant, et .. désigne le répertoire juste au dessus de celui où on se trouve. Pour illustrer leur usage, supposons que le répertoire courant soit /home/bob/stuff :

chemin relatif chemin absolu
cible /home/bob/stuff/cible
~/stuff/cible /home/bob/stuff/cible
./cible /home/bob/stuff/cible
../.. /home

Passons en revue quelques commandes très souvent employées.

bob@box:~$ pwd
/home/bob/

La commande pwd affiche le chemin absolu du répertoire courant. Il n'y a besoin de lui fournir ni argument ni option.

bob@box:~$ cd ..

La commande cd déplace le répertoire courant. Elle nécessite un argument qui doit être le chemin du nouveau répertoire courant. Si vous oubliez l'argument le répertoire courant reviendra à sa valeur par défaut (votre répertoire domicile).

bob@box:test$ ls
titi.txt  toto.txt
bob@box:test$ ls -l
total 2
-rw-r--r-- 1 bob bobs 67 Sep  1 19:49 titi.txt
-rw-r--r-- 1 bob bobs  4 Sep  1 19:49 toto.txt
bob@box:test$ ls -l toto.txt
-rw-r--r-- 1 bob bobs  4 Sep  1 19:49 toto.txt
bob@box:test$ ls -la
total 39
drwxr-xr-x 1 bob bobs  0 Sep  1 19:49 ./
drwxr-xr-x 1 bob bobs  0 Sep  1 19:48 ../
-rw-r--r-- 1 bob bobs  8 Sep  1 19:49 .tutu.txt
-rw-r--r-- 1 bob bobs 67 Sep  1 19:49 titi.txt
-rw-r--r-- 1 bob bobs  4 Sep  1 19:49 toto.txt

La commande ls affiche la liste des fichiers contenus dans le répertoire courant. L'option l donne plus d'informations sur chaque fichier, tandis que l'option a permet d'inclure les fichiers cachés (ainsi que les raccourcis . et ..). Si on fournit un fichier en argument à ls, seul ce fichier est affiché, et si on fournit à la place un répertoire, le contenu de celui-ci est affiché. ls peut recevoir plusieurs arguments et les traite les uns à la suite des autres.

bob@box:~$ less toto.txt

La commande less affiche le texte contenu dans un fichier. Pour cela, il occupe la totalité du terminal à la place du shell. Si le texte est trop long, on peut se déplacer avec les touches de défilement. Pour terminer la commande et revenir au shell, taper q.

bob@box:~$ man ls

La commande man affiche le manuel d'une commande, et fonctionne essentiellement comme less. Le format de ces manuels est standard, donc vous êtes encouragés à vous y habituer aussi vite que possible afin d'être capable d'y trouver les détails qui vous manquent sans perte de temps.

bob@box:~$ mkdir tmp

La commande mkdir crée un nouveau répertoire pour chaque chemin qui lui est passé en argument.

bob@box:~$ rm -rf tmp

La commande rm supprime un ou plusieurs fichiers. L'option r permet de supprimer des répertoires (et tout ce qu'il y a dedans avec). L'option f permet de ne pas avoir à confirmer chaque suppression.

Attention Toute suppression est définitive ! Il n'y a pas de système de corbeille comme sous Windows !

bob@box:~$ cp toto.txt ../../toto2.txt

La commande cp copie un fichier. Le premier argument est le fichier à copier, tandis que le dernier argument est soit le chemin du répertoire où copier, ou le chemin de la copie (qui peut alors porter un autre nom). L'option r permet de copier un répertoire ainsi que tout son contenu.

bob@box:~$ mv toto.txt ../../toto2.txt

La commande mv déplace un fichier. Elle utilise le même format que cp et permet donc également de renommer un fichier ou un répertoire.

  1. Orientation. Affichez le chemin du répertoire courant. S'il ne s'agit pas de votre répertoire domicile, déplacez-le. Affichez ensuite le contenu de ce répertoire. Y trouve-t-on des fichiers cachés ? Pouvez-vous déterminer à quelle date votre répertoire domicile a été créé ?

    Sans changer le répertoire courant, affichez le contenu du répertoire export qui se situe à la racine. Y trouve-t-on des fichiers cachés ?

  2. Organisation. Il est important de ne pas mélanger les fichiers des différents modules d'enseignement. Créez dans votre répertoire domicile un répertoire nommé DEV1.1.

    Remarque Notez que ce nom ne contient pas d'espace. Les espaces ne sont pas interdits, mais les noms qui en comportent sont plus pénibles à gérer car nous utilisons déjà les espaces pour séparer les arguments des commandes.

    Pour pouvoir facilement retrouver le travail produit durant chaque séance, créez dans le nouveau répertoire un sous-répertoire nommé TP01. Faites-en votre répertoire courant pour toutes les questions qui suivent.

    Créez un copie du répertoire DEV1.1 nommée DEV1.1bis et placée dans votre répertoire domicile (ne changez pas de répertoire courant). Examinez le contenu de cette copie pour vérifier qu'elle n'est pas vide. Nous n'avons pas vraiment besoin de cette copie, donc supprimez-la immédiatement après.

  3. Compilation. Nous allons créer notre premier programme basé sur un code source en langage C. Le code source en question vous est fourni sous la forme d'un fichier nommé salut.c et situé dans le répertoire /export/documents/is1+2/dev. Copiez ce fichier dans votre répertoire domicile (et non pas votre répertoire courant). Déplacez ensuite la copie dans le répertoire courant. C'était un détour inutile, mais à ce stade c'est un bon entraînement.

    La commande qui produit un exécutable à partir d'un fichier source est nommée gcc. Vous devez lui fournir la ou les source en argument. Une multitude d'options sont disponibles, et nous en verrons certaines un peu plus bas. Les deux options les plus utiles sont -ansi et -pedantic, qui forcent le compilateur à n'accepter que la version 89 du langage C.

    bob@box:~$ gcc -ansi -pedantic source1.c source2.c source3.c
    

    Attention Si l'exécution d'une commande de compilation ne produit aucun affichage, c'est que tout va bien. Un nouveau fichier nommé a.out a été créé dans le répertoire courant.

    Basé sur cet exemple, trouvez quelle commande utiliser pour compilez votre copie du code source et vérifiez qu'un nouveau fichier a bien été créé.

    Ce fichier est une nouvelle commande, que vous pouvez lancer (presque) comme les autres. Le seul souci est que le shell fait exprès de ne pas chercher le fichier d'une commande dans le répertoire courant (ce serait une source d'erreurs fréquentes). Il faut donc explicitement indiquer le chemin de notre fichier.

    bob@box:~$ ./a.out
    

    Le programme qui vous est proposé ici n'a pas besoin d'argument ni d'options, mais nous verrons bientôt comment exploiter cette possibilité.

  4. Observations. La compilation d'un exécutable se déroule en plusieurs étapes, et il est instructif de voir les résultats intermédiaires.

    Pour voir le résultat du préprocesseur, il suffit d'ajouter l'option -E. Pour obtenir un fichier avec un nom précis, nous allons également employer l'option -o suivie immédiatement par le nom désiré.

    bob@box:~$ gcc -ansi -pedantic -E -o intermediaire.i salut.c
    

    Pour voir le résultat du compilateur, il suffit d'ajouter l'option -c. Le fichier correspondant doit avoir l'extension .o.

    bob@box:~$ gcc -ansi -pedantic -c -o intermediaire.o salut.c
    

    Examinez ces fichiers et comparez-les avec le code source d'origine et l'exécutable final. Qu'est-ce qui est préservé ? Qu'est-ce qui est ajouté ? Qu'est-ce qui est perdu ?

    Remarque Si un fichier ne contient pas que du texte, la commande less affichera beaucoup de bêtises. Nous verrons bientôt des commandes plus adaptées à ce cas, mais en attendant vous pouvez chercher à l'œil nu si certaines parties du fichier sont encore lisibles.

retour à la page d'accueil

retour au sommet