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.
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 ?
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.
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/apl. 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é.
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.