Une partie importante de l’apprentissage du travail avec Ubuntu, et des distributions Linux en général, implique d’acquérir la maîtrise du travail dans l’environnement shell. Alors que les environnements de bureau graphiques tels que GNOME inclus avec Linux fournissent une interface conviviale au système d’exploitation, dans la pratique, l’environnement shell fournit des capacités, une flexibilité et une automatisation bien plus grandes que celles qui peuvent jamais être réalisées à l’aide des outils de bureau graphiques. L’environnement shell fournit également un moyen d’interagir avec le système d’exploitation lorsqu’un environnement de bureau n’est pas disponible, ce qui est fréquent lorsqu’on travaille avec un système d’exploitation basé sur un serveur tel qu’Ubuntu ou un système endommagé qui ne démarre pas complètement.

Le but de ce chapitre, par conséquent, est de fournir une vue d’ensemble de l’environnement shell par défaut sur Ubuntu (spécifiquement le shell Bash).

1.1 Qu’est-ce qu’un shell ?

Le shell est un environnement d’interprétation de commandes interactif au sein duquel les commandes peuvent être tapées à une invite ou entrées dans un fichier sous la forme d’un script et exécutées. Les origines du shell remontent aux premiers jours du système d’exploitation UNIX. En fait, dans les premiers jours de Linux, avant l’introduction des bureaux graphiques, l’interpréteur de commandes était le seul moyen pour un utilisateur d’interagir avec le système d’exploitation.

Une variété d’environnements d’interpréteur de commandes a été développée au fil des ans. Le premier shell largement utilisé était le shell Bourne, écrit par Stephen Bourne aux Bell Labs.

Pourtant, une autre création précoce était le shell C qui partageait certaines similitudes syntaxiques avec le langage de programmation C et introduisait des améliorations de convivialité telles que l’édition de la ligne de commande et l’historique.

Le shell Korn (développé par David Korn aux Bell Labs) est basé sur des fonctionnalités fournies par le shell Bourne et le shell C.

Le shell par défaut sur Ubuntu est le shell Bash (abréviation de Bourne Again SHell). Ce shell, qui a commencé sa vie comme une version open source du shell Bourne, a été développé pour le projet GNU par Brian Fox et est basé sur des fonctionnalités fournies par le shell Bourne et le shell C.

1.2 Accéder au shell

Dans l’environnement de bureau GNOME, l’invite du shell peut être accessible à partir d’une fenêtre Terminal en sélectionnant l’option Activités dans la barre supérieure, en entrant Terminal dans la barre de recherche et en cliquant sur l’icône Terminal.

Lorsqu’il se connecte à distance à un serveur Ubuntu, par exemple en utilisant SSH, l’utilisateur est également présenté avec une invite du shell. Les détails sur l’accès à un serveur distant à l’aide de SSH seront abordés dans le chapitre intitulé « Configuration de l’authentification basée sur une clé SSH sur Ubuntu ». Lors du démarrage d’un système basé sur serveur dans lequel un environnement de bureau n’a pas été installé, l’interpréteur de commandes est entré immédiatement après que l’utilisateur ait terminé la procédure de connexion au terminal de console physique ou à la session de connexion distante.

1.3 Saisie de commandes à l’invite

Les commandes sont saisies à l’invite de l’interpréteur de commandes simplement en tapant la commande et en appuyant sur la touche Entrée. Bien que certaines commandes effectuent des tâches de manière silencieuse, la plupart affichent une certaine forme de sortie avant de revenir à l’invite. Par exemple, la commande ls peut être utilisée pour afficher les fichiers et les répertoires dans le répertoire de travail actuel :

$ ls

Desktop Documents Downloads Music Pictures Public Templates Videos

Les commandes disponibles sont soit intégrées dans le shell lui-même, soit résident sur le système de fichiers physique. L’emplacement sur le système de fichiers d’une commande peut être identifié à l’aide de la commande which. Par exemple, pour savoir où l’exécutable ls réside sur le système de fichiers:

$ which ls alias ls='ls --color=auto' /usr/bin/ls

Il est clair que la commande ls réside dans le répertoire /usr/bin. Notez également qu’un alias est configuré, un sujet qui sera abordé plus tard dans ce chapitre. L’utilisation de la commande which pour localiser le chemin d’accès à des commandes intégrées à l’interpréteur de commandes donnera lieu à un message indiquant que l’exécutable est introuvable. Par exemple, tenter de trouver l’emplacement de la commande history (qui est en fait intégrée au shell plutôt que d’exister en tant qu’exécutable sur le système de fichiers) entraînera une sortie similaire à ce qui suit :

$ which history/usr/bin/which: no history in (/home/demo/.local/bin:/home/demo/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin)

1.4 Obtenir des informations sur une commande

Plusieurs des commandes disponibles dans le shell Linux peuvent sembler cryptiques au départ. Pour obtenir des informations détaillées sur ce que fait une commande et comment l’utiliser, utilisez la commande man en spécifiant le nom de la commande comme argument. Par exemple, pour en savoir plus sur la commande pwd :

$ man pwd

Lorsque la commande ci-dessus est exécutée, une description détaillée de la commande pwd s’affiche. De nombreuses commandes fourniront également des informations supplémentaires lorsqu’elles sont exécutées avec l’option de ligne de commande -help :

$ wc --help

1.5 Edition de la ligne de commande Bash

Les premiers environnements shell ne fournissaient aucune forme de capacités d’édition de ligne. Cela signifiait que si vous repériez une erreur au début d’une longue ligne de commande que vous étiez en train de taper, vous deviez supprimer tous les caractères suivants, corriger l’erreur, puis saisir à nouveau le reste de la commande. Heureusement, Bash offre un large éventail d’options d’édition de la ligne de commande, comme le montre le tableau suivant :

Séquence de touches Action
Ctrl-b ou Flèche gauche Reculer le curseur d’une position
Ctrl-.f ou Flèche droite Déplacement du curseur vers l’avant d’une position
Suppression Suppression du caractère se trouvant actuellement sous le curseur
Effacement arrière Supprimer le caractère à gauche du curseur
Ctrl-._ Annuler la modification précédente (peut être répété pour annuler toutes les modifications précédentes)
Ctrl-a Déplacer le curseur au début de la ligne
Ctrl-e Déplacer le curseur à la fin de la ligne
Méta…f ou Esc puis f Déplacement du curseur en avant d’un mot
Meta-b ou Esc puis b Déplacement du curseur en arrière d’un mot
Ctrl-l Effacer l’écran de tout sauf de la commande en cours
Ctrl-k Supprimer jusqu’à la fin de la ligne à partir de la position actuelle du curseur
Méta…d ou Esc puis d Suppression à la fin du mot courant
Meta-DEL ou Esc puis DEL Suppression du début du mot courant
Ctrl-w Suppression de la position actuelle du curseur à l’espace blanc précédent

Tableau 9-1

1.6 Travailler avec l’historique de l’interpréteur de commandes

En plus des fonctionnalités d’édition de la ligne de commande, l’interpréteur de commandes Bash fournit également un support pour l’historique de la ligne de commande. Une liste des commandes précédemment exécutées peut être visualisée en utilisant la commande historique :

$ history1ps2ls3ls –l /4ls5man pwd6man apropos

En outre, Ctrl-p (ou flèche vers le haut) et Ctrl-n (ou flèche vers le bas) peuvent être utilisés pour faire défiler en arrière et en avant les commandes précédemment saisies. Lorsque la commande souhaitée dans l’historique est affichée, appuyez sur la touche Entrée pour l’exécuter.

Une autre option consiste à saisir le caractère ‘!’ suivi des premiers caractères de la commande à répéter puis de la touche Entrée.

1.7 Raccourci de nom de fichier

De nombreuses commandes de l’interpréteur de commandes prennent un ou plusieurs noms de fichiers comme arguments. Par exemple, pour afficher le contenu d’un fichier texte nommé list.txt, la commande cat serait utilisée comme suit :

$ cat list.txt

De même, le contenu de plusieurs fichiers texte pourrait être affiché en spécifiant tous les noms de fichiers comme arguments :

$ cat list.txt list2.txt list3.txt list4.txt

Au lieu de taper chaque nom, le filtrage de motifs peut être utilisé pour spécifier tous les fichiers dont les noms correspondent à certains critères. Par exemple, le caractère générique ‘*’ peut être utilisé pour simplifier l’exemple ci-dessus :

$ cat *.txt

La commande ci-dessus affichera le contenu de tous les fichiers se terminant par une extension .txt. Cela pourrait être encore plus restreint à tous les noms de fichiers commençant par list et se terminant par .txt:

$ cat list*.txt

Des correspondances à caractère unique peuvent être spécifiées en utilisant le caractère ‘?’:

$ cat list?.txt

1.8 Complément de nom de fichier et de chemin

Plutôt que de taper un nom de fichier ou un chemin entier, ou d’utiliser la correspondance de motifs pour réduire la quantité de frappe, le shell fournit la fonctionnalité de complément de nom de fichier. Pour utiliser cette fonction, il suffit de saisir les premiers caractères du nom du fichier ou du chemin d’accès, puis d’appuyer deux fois sur la touche Echap. L’interpréteur de commandes complète alors le nom du fichier par le premier nom de fichier ou de chemin du répertoire qui correspond aux caractères que vous avez saisis. Pour obtenir une liste des correspondances possibles, appuyez sur Esc = après avoir saisi les premiers caractères.

1.9 Redirection des entrées et des sorties

Comme nous l’avons mentionné précédemment, de nombreuses commandes de l’interpréteur de commandes produisent des informations en sortie lors de leur exécution. Par défaut, cette sortie va dans un fichier de périphérique nommé stdout qui est essentiellement la fenêtre du terminal ou la console dans laquelle le shell s’exécute. Inversement, l’interpréteur de commandes prend des entrées à partir d’un fichier de périphérique nommé stdin, qui est par défaut le clavier.

La sortie d’une commande peut être redirigée de stdout vers un fichier physique sur le système de fichiers en utilisant le caractère ‘>’. Par exemple, pour rediriger la sortie d’une commande ls vers un fichier nommé files.txt, la commande suivante serait nécessaire:

$ ls *.txt > files.txt

Après achèvement, files.txt contiendra la liste des fichiers dans le répertoire actuel. De même, le contenu d’un fichier peut être introduit dans une commande à la place de stdin. Par exemple, pour rediriger le contenu d’un fichier comme entrée d’une commande :

$ wc –l < files.txt

La commande ci-dessus affichera le nombre de lignes contenues dans le fichier files.txt.

Il est important de noter que l’opérateur de redirection ‘>’ crée un nouveau fichier, ou tronque un fichier existant lorsqu’il est utilisé. Afin d’ajouter à un fichier existant, utilisez l’opérateur ‘>>’:

$ ls *.dat >> files.txt

En plus de la sortie standard, l’interpréteur de commandes fournit également une sortie d’erreur standard en utilisant stderr. Alors que la sortie d’une commande est dirigée vers stdout, tout message d’erreur généré par la commande est dirigé vers stderr. Cela signifie que si stdout est dirigé vers un fichier, les messages d’erreur apparaîtront toujours dans le terminal. C’est généralement le comportement souhaité, bien que stderr puisse également être redirigé si on le souhaite en utilisant l’opérateur ‘2>’:

$ ls dkjfnvkjdnf 2> errormsg

À la fin de la commande, une erreur signalant le fait que le fichier nommé dkjfnvkjdnf n’a pas pu être trouvé sera contenue dans le fichier errormsg.

Les deux stderr et stdout peuvent être redirigés vers le même fichier en utilisant l’opérateur &>:

$ ls /etc dkjfnvkjdnf &amp;&gt; alloutput

À la fin de l’exécution, le fichier alloutput contiendra à la fois une liste du contenu du répertoire /etc, et le message d’erreur associé à la tentative de lister un fichier inexistant.

1.10 Travailler avec des tuyaux dans le shell Bash

En plus de la redirection des entrées/sorties, le shell permet également à la sortie d’une commande d’être acheminée directement comme entrée à une autre commande. Une opération de pipe est réalisée en plaçant le caractère ‘|’ entre deux ou plusieurs commandes sur une ligne de commande. Par exemple, pour compter le nombre de processus en cours d’exécution sur un système, la sortie de la commande ps peut être canalisée vers la commande wc:

$ ps –ef | wc –l

Il n’y a pas de limite au nombre d’opérations de canalisation qui peuvent être effectuées sur une ligne de commande. Par exemple, pour trouver le nombre de lignes dans un fichier qui contiennent le nom Smith:

$ cat namesfile | grep Smith | wc –l

1.11 Configuration des alias

A mesure que vous gagnez en compétence avec l’environnement shell, il est probable que vous vous retrouverez à émettre fréquemment des commandes avec les mêmes arguments. Par exemple, vous pouvez souvent utiliser la commande ls avec les options l et t :

$ ls –lt

Pour réduire la quantité de frappe impliquée dans l’émission d’une commande, il est possible de créer un alias qui correspond à la commande et aux arguments. Par exemple, pour créer un alias tel que la saisie de la lettre l entraîne l’exécution de la commande ls -lt, l’instruction suivante serait utilisée :

$ alias l="ls –lt"

Saisir l à l’invite de commande exécutera maintenant l’instruction originale.

1.12 Variables d’environnement

Les variables d’environnement du shell fournissent un stockage temporaire des données et des paramètres de configuration. Le shell lui-même configure un certain nombre de variables d’environnement qui peuvent être changées par l’utilisateur pour modifier le comportement du shell. Une liste des variables actuellement définies peut être obtenue en utilisant la commande env:

$ envSSH_CONNECTION=192.168.0.19 61231 192.168.0.28 22MODULES_RUN_QUARANTINE=LD_LIBRARY_PATHLANG=en_US.UTF-8HISTCONTROL=ignoredupsHOSTNAME=demo-pc.ebookfrenzy.comXDG_SESSION_ID=15MODULES_CMD=/usr/share/Modules/libexec/modulecmd.tclUSER=demoENV=/usr/share/Modules/init/profile.shSELINUX_ROLE_REQUESTED=PWD=/home/demoHOME=/home/demoSSH_CLIENT=192.168.0.19 61231 22SELINUX_LEVEL_REQUESTED= ...

Peut-être que la variable d’environnement la plus utile est PATH. Elle définit les répertoires dans lesquels l’interpréteur de commandes recherchera les commandes saisies à l’invite de commande, et l’ordre dans lequel il le fera. La variable d’environnement PATH pour un compte utilisateur sur un système Ubuntu nouvellement installé sera probablement configurée comme suit :

$ echo $PATH/home/demo/.local/bin:/home/demo/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/ bin:/usr/local/sbin:/usr/sbin

Une autre variable utile est HOME qui spécifie le répertoire d’origine de l’utilisateur actuel. Si, par exemple, vous vouliez que le shell recherche également les commandes dans le répertoire des scripts situé dans votre répertoire personnel, vous modifieriez la variable PATH comme suit:

$ export PATH=$PATH:$HOME/scripts

La valeur actuelle d’une variable d’environnement existante peut être affichée en utilisant la commande echo:

$ echo $PATH

Vous pouvez créer vos propres variables d’environnement en utilisant la commande export. Par exemple:

$ export DATAPATH=/data/files

Une astuce utile pour affecter la sortie d’une commande à une variable d’environnement implique l’utilisation de guillemets (`) autour de la commande. Par exemple, pour affecter la date et l’heure actuelles à une variable d’environnement appelée NOW:

$ export NOW=`date`$ echo $NOWTue Apr 2 13:48:40 EDT 2020

S’il existe des paramètres de variables d’environnement ou d’alias que vous devez configurer chaque fois que vous entrez dans l’environnement du shell, ils peuvent être ajoutés à un fichier dans votre répertoire personnel nommé .bashrc. Par exemple, le fichier .bashrc suivant est configuré pour configurer la variable d’environnement DATAPATH et un alias:

# .bashrc # Source global definitionsif ; then . /etc/bashrcfi # User specific environmentPATH="$HOME/.local/bin:$HOME/bin:$PATH"export PATH # Uncomment the following line if you don't like systemctl's auto-paging feature:# export SYSTEMD_PAGER= # User specific aliases and functionsexport DATAPATH=/data/filesalias l="ls -lt"

1.13 Écrire des scripts de shell

Jusqu’ici, nous nous sommes concentrés exclusivement sur la nature interactive du shell Bash. Par interactif, nous entendons la saisie manuelle de commandes à l’invite, une par une, et leur exécution. En fait, ce n’est qu’une petite partie de ce dont le shell est capable. L’un des aspects les plus puissants de l’interpréteur de commandes est sans doute la possibilité de créer des scripts. Les scripts de l’interpréteur de commandes sont essentiellement des fichiers texte contenant des séquences d’instructions qui peuvent être exécutées dans l’environnement de l’interpréteur de commandes pour effectuer des tâches. En plus de la capacité d’exécuter des commandes, l’interpréteur de commandes fournit de nombreuses constructions de programmation telles que les boucles for et do et les instructions if que vous pourriez raisonnablement vous attendre à trouver dans un langage de script.

Malheureusement, un aperçu détaillé du scriptage de l’interpréteur de commandes dépasse la portée de ce chapitre. Il existe cependant de nombreux livres et ressources web dédiés au shell scripting qui rendent beaucoup plus justice au sujet que nous ne pourrions jamais espérer réaliser ici. Dans cette section, nous ne fournirons donc qu’un très petit aperçu du scriptage shell.

La première étape de la création d’un script shell consiste à créer un fichier (pour les besoins de cet exemple, nous le nommerons simple.sh) et d’ajouter ce qui suit comme première ligne:

#!/bin/sh

Le # ! est appelé le « shebang » et est une séquence spéciale de caractères indiquant que le chemin vers l’interpréteur nécessaire pour exécuter le script est le prochain élément sur la ligne (dans ce cas, l’exécutable sh situé dans /bin). Cela pourrait également être, par exemple, /bin/csh ou /bin/ksh si l’un ou l’autre était l’interprète que vous vouliez utiliser.

L’étape suivante consiste à écrire un script simple :

#!/bin/shfor i in *do echo $idone

Tout ce que fait ce script est d’itérer à travers tous les fichiers du répertoire actuel et d’afficher le nom de chaque fichier. Il peut être exécuté en passant le nom du script comme argument à sh:

$ sh simple.sh

Pour rendre le fichier exécutable (annulant ainsi le besoin de le passer à la commande sh) la commande chmod peut être utilisée:

$ chmod +x simple.sh

Une fois que le bit execute a été activé sur les permissions du fichier, il peut être exécuté directement. Par exemple :

$ ./simple.sh

1.14 Résumé

Dans ce chapitre d’Ubuntu Essentials, nous avons fait un bref tour de l’environnement du shell Bash. Dans le monde des environnements de bureau graphiques, il est facile d’oublier que la véritable puissance et la flexibilité d’un système d’exploitation ne peuvent souvent être utilisées qu’en descendant en dessous de l’interface de bureau conviviale et en utilisant un environnement shell. De plus, la familiarité avec le shell est une nécessité lorsqu’on doit administrer et maintenir des systèmes basés sur des serveurs qui n’ont pas le bureau installé ou lorsqu’on tente de réparer un système endommagé au point que le bureau ou l’interface Cockpit ne se lance plus.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.