Fonctionnement général de Bash
Le shell Bash est un langage qui sert uniquement à recevoir des commandes de notre part et à les transmettre à notre OS. Nous allons pouvoir utiliser Bash pour envoyer toutes sortes d’instructions à notre OS. On va par exemple pouvoir utiliser Bash pour obtenir la liste des fichiers sur notre ordinateur, pour les lire, les déplacer, les copier ou les supprimer.
Les commandes sont au cœur du langage shell Bash. Les commandes indiquent à Bash ce qu’on souhaite faire, étape par étape, commande par commande. Bash prend généralement une commande à la fois, exécute la commande et, une fois terminé, nous renvoie à la commande suivante. Nous appelons cette exécution de commande synchrone.
Il est important de comprendre que tant que Bash est occupé par une commande que nous lui donnons, nous ne pouvons pas interagir directement avec Bash : il faut attendre que la commande précédente ait été exécutée. Pour la plupart des commandes, cela sera transparent pour nous car elles vont être exécutées très rapidement. Cependant, certaines commandes peuvent prendre un certain temps.
Bash est principalement un langage basé sur les lignes. Lorsque Bash lit nos commandes, il le fait ligne par ligne. La plupart des commandes ne constituent qu’une ligne. Il faudra préciser explicitement qu’une commande n’est pas terminée à la fin d’une ligne pour que Bash le comprenne. Dans le cas contraire, Bash considèrera que la fin de la ligne correspond à la fin de la commande.
Si une commande n’est pas complète, Bash ne pourra pas faire son travail. Dans ce cas là, généralement, il va afficher une invite spéciale : >
. Cette invite signifie littéralement “la commande que vous m’avez donnée n’est pas encore terminée, j’attends la suite”. On va alors pouvoir compléter la commande sur la ligne suivante et ainsi de suite jusqu’à ce que Bash ait assez d’élément pour exécuter la commande en question.
Construction d’une commande Bash
Avant de passer en revue les noms de commandes Bash les plus utilisées, il convient de bien comprendre les différents éléments d’une commande Bash.
Les commandes Bash peuvent en effet être très simples et n’être composées que du nom de la commande à exécuter ou être des commandes plus complexes comportant des options, des arguments, etc.
Le nom d’une commande Bash
Le nom de la commande permet à Bash de comprendre ce qu’on souhaite obtenir. En effet, Bash possède nativement (c’est-à-dire dans le langage en soi) une liste de noms de commandes qui sont liées à certaines actions. Dès que Bash reconnait le nom d’une commande, il effectue les actions qui lui sont liées.
Pour être tout à fait précis, dès que Bash reçoit une commande il utilise le nom de la commande et effectue une recherche sur la manière de l’exécuter. Dans l’ordre, Bash vérifiera s’il a une fonction ou un Builtin portant ce nom. À défaut, Bash essaiera de trouver un programme portant le nom de la commande pour l’exécuter. Si Bash ne trouve aucun moyen d’exécuter votre commande, un message d’erreur s’affichera.
Les fonctions sont des blocs de commandes portant un nom. Les commandes sont “enfermées” dans la fonction et il suffit d’appeler la fonction en écrivant son nom pour exécuter toutes les commandes qu’elle contient. On utilise généralement les fonctions lorsqu’on doit exécuter une même suite de commandes de nombreuses fois car cela évite d’avoir à les réécrire à chaque fois.
Les Builtins (“préconstruit” ou “prédéfini”) sont de minuscules procédures construites dans Bash. Ce sont de petites opérations qui ont été programmées dans Bash et Bash n’a pas besoin de lancer un programme spécial pour pouvoir les exécuter.
Bash possède de nombreuses commandes prédéfinies nous permettant de nous déplacer dans les répertoires (les dossiers) de notre machine, d’afficher le contenu d’un répertoire ou de manipuler des fichiers par exemple.
La commande pwd
, par exemple, renvoie le chemin du répertoire courant (le répertoire dans lequel on se trouve) par rapport au répertoire racine (le répertoire de base) de notre machine et permet donc de savoir où on se situe dans notre ordinateur. La commande ls
affiche elle le contenu d’un répertoire.
Un programme correspond à un ensemble d’instructions regroupées pour effectuer certaines opérations précises. Nous avons toutes sortes de programmes installés sur nos machines : certains programmes livrés avec notre système d’exploitation, d’autres ajoutés par nous ou par notre administrateur système.
Ces différents programmes peuvent être installés à différents endroits sur nos machines. Sur un système UNIX standard, il existe quelques emplacements normalisés pour les programmes : /bin, /usr/bin, etc. Ce serait un réel problème si nous devions nous souvenir de l’emplacement exact de nos programmes, d’autant plus qu’ils peuvent varier d’un système à l’autre. Heureusement, il existe une variable d’environnement très spéciale et extrêmement utile nommée PATH. Votre variable PATH contient un ensemble de répertoires dans lesquels Bash recherchera des programmes.
Parfois, on voudra exécuter un programme qui n’est installé dans aucun des répertoires PATH. Dans ce cas, il faudra spécifier manuellement le chemin d’accès où Bash peut trouver le programme, et pas seulement son nom.
Les arguments d’une commande Bash
Bash possède de nombreuses commandes prédéfinies. Certaines de ces commandes servent à effectuer des opérations sur des fichiers comme la lecture du contenu d’un fichier, la copie d’un fichier, sa suppression, etc;
Pour fonctionner correctement, la plupart de ces commandes vont avoir besoin d’un contexte : quel fichier doit être lu ou supprimé, où copier un fichier, etc. Nous allons fournir ces informations de contexte sous la forme d’arguments. Un “argument” est juste un terme utilisé pour désigner une information qu’on va passer après le nom d’une commande et qui sert à préciser comment doit s’exécuter la commande.
La commande cd
(“change directory”), par exemple, va nous permettre de nous déplacer dans le système en se plaçant dans un nouveau répertoire (ou “dossier”). Pour que cette commande fonctionne, on va devoir lui passer le chemin du répertoire dans lequel on souhaite se placer (chemin relatif par rapport au répertoire de départ) en argument.
La commande cp
permet pour sa part de copier un fichier. Pour fonctionner, elle va avoir besoin qu’on lui passe le nom du fichier à copier ainsi que l’emplacement où on souhaite stocker la copie en arguments.
Ici, on commence par utiliser cd
pour se placer sur le bureau puis on utilise cp
pour copier un fichier appelé “test.txt” présent sur notre bureau dans un sous dossier “cours” également présent sur notre bureau.
Lorsqu’une commande a besoin de plusieurs arguments, nous les lui passons à la suite en les séparant avec un espace. Dans le cas de la copie d’un fichier, cependant, cette façon de faire peut rapidement s’avérer problématique. En effet, que se passe-t-il si le nom du fichier à copier possède des espaces par exemple ?
Dans ce cas, Bash analysera chaque espace comme la délimitation entre deux arguments et notre commande ne fonctionnera pas. Pour éviter ce problème, nous avons deux solutions : l’échappement et la citation.
“Echapper” un caractère signifie en programmation neutraliser son sens spécial. En échappant nos espaces, par exemple, on va indiquer à Bash que ces espaces ne sont que des espaces et doivent être traités en tant que tels et non pas agir comme délimiter entre arguments. Pour échapper un caractère, on fait précéder le caractère d’un antislash.
“Citer” correspond à entourer une chaine de caractères avec des guillemets ou des apostrophes droits. Cela permet d’indiquer à Bash que tout ce qui se trouve entre guillemets ou apostrophes doit être interprété littéralement, c’est-à-dire en tant que tel.
Vous pouvez noter qu’il existe une légère différence entre les apostrophes et les guillemets : tout ce qui se situe entre apostrophe sera interprété littéralement tandis que certaines expressions seront interprétées avec leur sens spécial lorsqu’on utilise des guillemets. On utilisera donc plutôt les uns ou les autres en fonction de la situation et de ce qui est le plus simple.
Les options d’une commande Bash
En plus des arguments, on peut également ajouter des options à une commande Bash. Les options vont modifier le comportement standard de la commande.
Pour ajouter une option à une commande, on va utiliser un tiret court “-“ suivi du nom de l’option ou d’une lettre qui sert de raccourci pour le nom de l’option.
Ici, vous devez bien comprendre que chaque commande va supporter une liste d’options différente des autres. En plus de cela, un même nom d’option peut définir un comportement différent selon la commande avec laquelle elle est utilisée.
Nous utiliserons des options avec certaines commande dans la suite de ce cours afin de se familiariser avec celles-ci et surtout verrons comment obtenir la liste des options supportées par chaque commande et leur signification.