L’enchaînement des commandes sous Linux
I. Présentation
Sous Linux, quand nous travaillons en ligne de commande, il est souvent bien pratique d'avoir la possibilité d'exécuter plusieurs commandes en une seule ligne. Par exemple si l'on souhaite télécharger, décompresser et ouvrir une archive, on exécutera une seule ligne de commande comme suivant:
wget http://archive.tar.gz/ ; tar zxvf -C /opt/ archive.tar.gz ; cd /opt/archive/
Au lieu d'exécuter plusieurs de ces commandes séparément et avec une commande par ligne. Il est néanmoins important dans l'exécution de ces commandes que chacune réussissent pour que la prochaine soit utilisable et utile.
II. les caractères d'enchainement
Il existe sous Linux trois caractères qui permettent l'enchainement des commandes, il s'agit de ";", "||" et "&&. Chacun de ces trois caractères ont un type d'exécution différents au niveau de l'enchainement des commandes.
III. Le point virgule
Un enchainement de commande avec un point virgule comme c'est le cas dans l'exemple enchaînera les commandes sans se soucier de la réussite ou de l'échec de chacune. On peut utiliser ces commandes quand nous sommes sûr de leurs réussites ou alors quand leurs bonnes exécutions n'est pas importante.
Par exemple si l'on souhaite créer un dossier puis s'y rendre pour y créer un fichier vide, on exécutera le commande suivante :
mkdir /home/~/dossier1/; cd /home/~/dossier1/ ; touch file1
Nous sommes ici certains que chaque commande s'exécutera correctement. C'est néanmoins la manière la moins "propre" d'enchainer les commandes sous Linux.
En effet, sur des commandes différentes et plus complexes, on peut imaginer qu'une commande puisse mal s'exécuter et ainsi, qu'elle perturbe l'exécution de toutes les commandes suivantes. Il serait alors préférable d'être capable de n'exécuter les commandes suivantes uniquement si les précédentes se sont correctement executées.
IV. Le "&&"
Il est parfois utile d'exécuter une commande que si les commandes précédentes ont réussies. Par exemple si l'on souhaite vérifier l'existence d'un dossier et, si il existe, y créer un fichier :
cd /home/~/dossier1 && touch file1
Ici, si la commande "cd /home/~/dossier1" ne s'exécute pas correctement (que le dossier n'existe pas), la commande "touch file1" qui créer un fichier vide ne s'exécutera pas non plus et par conséquent ne déclenchera pas de message d'erreur.
Linux enregistre un paramètre à chaque exécution de commande (comme un flag) qui peut être récupéré dans un script (par exemple). Ce paramètre se met à "0" si la commande s'est executée correctement et à "2" (dans la plupart des cas) quand la commande à échouée.
Pour déterminer si une commande a bien réussie, Linux analyse ce paramètre et, dans le cas d'un "0" avec un enchainement de commande "&&", il exécute la commande suivante. Si le paramètre en question est "2", c'est que la commande précédente ne s'est pas correctement déroulée et il met donc fin à l'exécution des prochaines commandes.
V. Le "||"
Dans d'autres cas, il peut être intéressant d'exécuter une commande uniquement si la commande précédente ne se déroule pas correctement au lieu de mettre fin à toute la ligne de commande. Cela est possible avec les caractères "||".
Par exemple si l'on souhaite, comme auparavant, voir si un dossier existe et si c'est le cas y créer un fichier. On peut également vouloir créer le dossier si il n'est pas encore présent :
cd /home/~/dossier1 || mkdir / /home/~/dossier1 && touch file1
C'est un exemple simple mais on peut imaginer des choses beaucoup plus complexes. Ici, si le retour du paramètre de vérification de l'exécution de la commande n'est pas "0" (= la commande "cd /home/~/dossier1" à échouée), on créera le fichier avec la commande "mkdir". Dans un second temps suite à cela on créera le fichier "file1".
Bonjour !
Il serait intéressant de noter l’ordre des commandes : Visiblement, ca n’est pas comme les additions où le * importe sur le +
( 1+2*3 n’a pas le même résultat que (1+2)*3)
Merci !
Merci pour cet article clair et utile.