L’enchaînement des commandes sous Linux : comment ça marche ?
Sommaire
I. Présentation
Sous Linux, il est souvent nécessaire d’exécuter plusieurs commandes pour accomplir une tâche. Parfois, pour gagner en efficacité, il peut s'avérer utile d'enchainer plusieurs commandes à la suite, pour que les commandes soient exécutées les unes après les autres. Mais, comment faire ?
Ce tutoriel présente les différentes manières d’enchaîner des commandes sous Linux, au travers de plusieurs exemples. Ce qui pourra nous permettre, par exemple, de passer de cette syntaxe :
sudo apt-get update
sudo apt-get upgrade -y
À celle-ci :
sudo apt-get update && sudo apt-get upgrade -y
Avant de commencer, sachez que sur Linux, il y a plusieurs caractères qui jouent le rôle d'opérateurs et permettent l'enchainement des commandes :
- Le point-virgule ";"
- La double esperluette "&&"
- La double barre verticale "||"
- Le pipeline "|"
Chaque caractère a un comportement différent au niveau de l'enchainement des commandes, comme nous le verrons dans la suite de cet article.
Version originale de l'article : 24 décembre 2012.
II. Utilisation du point virgule
Sur Linux, le point-virgule permet d’enchaîner plusieurs commandes, indépendamment de leur réussite ou échec. Ainsi, toutes les commandes s’exécutent dans l’ordre, même si une commande précédente échoue. Il n'y a aucun contrôle sur le résultat de la commande précédente.
Par exemple, si nous souhaitons créer un dossier, accéder à ce dossier, puis créer un fichier vide, nous allons enchainer trois commandes de cette façon :
mkdir /home/flo/dossier1/; cd /home/flo/dossier1/; touch monfichier.txt
Compte tenu des permissions actuelles de l'utilisateur, nous pouvons estimer que tout va se passer comme prévu et qu'il n'y a pas réellement de risques. Néanmoins, cette méthode peut être considérée comme la moins "propre" pour enchainer les commandes sous Linux.
En effet, sur des commandes différentes et plus complexes, nous pouvons imaginer qu'une commande rencontre un problème et retourne une erreur. Ainsi, elle perturbera l'exécution de toutes les commandes suivantes ! Il serait alors préférable d'être capable d'exécuter les commandes suivantes uniquement si les précédentes se sont correctement exécutées...
III. Utilisation du double esperluette
Pour répondre à la problématique évoquée précédemment, nous pouvons compter sur l'utilisation du double esperluette pour effectuer l'enchainement des commandes. Si nous reprenons l'exemple précédent, cela donne :
mkdir /home/flo/dossier1/ && cd /home/flo/dossier1/ && touch monfichier.txt
À présent, si la commande "cd /home/flo/dossier1" échoue, la commande touch destinée à créer le fichier ne s'exécutera pas non plus, tout comme la commande cd. Ainsi, il n'y aura pas d'erreurs supplémentaires.
Au lieu de cibler le répertoire "/home/flo" pour créer "dossier1", imaginons que par erreur, j'indique "/home/FLO". Cela est incorrect puisque Linux tient compte de la casse. Si nous effectuons un enchainement de commandes avec le point-virgule, les deux premières commandes vont retourner une erreur, tandis que la troisième (touch) va correctement s'exécuter. Le problème, c'est qu'au lieu de créer le fichier dans le répertoire "/home/flo/dossier1", elle va le créer dans le répertoire courant ! Si nous effectuons le même test avec l'opérateur "&&", nous pouvons voir que l'exécution est arrêtée suite à l'erreur rencontrée par la commande mkdir.
Sous Linux, chaque commande retourne un code de sortie qui peut être récupéré via la variable $? (comme avec PowerShell). Un code de sortie de 0 indique un succès, tandis qu’un code différent de 0 (par exemple 1 ou 2 selon les cas) signale une erreur. Linux utilise ces codes pour déterminer si la commande suivante doit être exécutée dans un enchaînement.
Voici un exemple :
Un autre exemple courant est l’enchainement des commandes pour mettre à jour et upgrader les paquets sur une distribution basée sur Debian :
sudo apt-get update && sudo apt-get upgrade -y
Dans cet exemple, "sudo apt-get upgrade -y" s’exécutera uniquement si la commande "sudo apt-get update" réussit.
Nous pourrions aussi appliquer cette méthode pour télécharger une archive, l'extraire, puis se déplacer dans le répertoire obtenu.
wget https://example.com/archive.tar.gz && tar zxvf archive.tar.gz -C /opt/ && cd /opt/archive/
Dans cet exemple, chaque étape est conditionnée par la réussite de la précédente :
- La commande wget télécharge le fichier archive.
- Si le téléchargement réussit, tar extrait l'archive dans le répertoire /opt/.
- Enfin, si l'extraction est réussie, cd change le répertoire courant vers le dossier extrait.
IV. Utilisation de la double barre verticale
Le double barre verticale permet d’exécuter une commande uniquement si la commande précédente échoue (code de sortie différent de 0).
cd /home/flo/dossier1/ || echo "Le dossier n'existe pas."
Dans cet exemple très simple, si le dossier n’existe pas, le message "Le dossier n'existe pas." sera affiché dans la console (en plus de l'erreur retournée par la commande).
Par exemple, nous pouvons tenter d'accéder au répertoire "/home/flo/dossier1", et s'il n'existe pas, nous allons le créer.
cd /home/flo/dossier1 || mkdir /home/flo/dossier1
Vous pouvez également combiner plusieurs opérateurs pour créer des enchaînements plus complexes. Ici, le message "Erreur !" sera retourné dans la console si l'une des deux commandes retourne une erreur.
mkdir /home/flo/dossier1 && cd /home/flo/dossier1 || echo "Erreur !"
V. Utilisation du pipeline
Le pipeline est un opérateur très utilisé avec les langages de scripting et de programmation, y compris avec Bash (et PowerShell). Il permet de rediriger la sortie standard d’une première commande vers l’entrée standard d’une seconde commande (et ainsi de suite). Bien que son intérêt soit un peu différent que l'enchainement de commandes tel que nous venons de l'évoquer, il est important de le connaitre.
L'exemple ci-dessous permet d'afficher uniquement les fichiers ayant l’extension ".txt" dans le répertoire courant, grâce à un filtre basé sur grep.
ls -l | grep ".txt"
VI. Conclusion
En utilisant ces opérateurs, vous pouvez créer des enchaînements efficaces pour automatiser vos tâches sous Linux. Bien entendu, vous pouvez aussi en faire usage dans vos scripts Bash ! N’hésitez pas à les tester de votre côté et à les appliquer à vos besoins.
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.