Bourne-Again shell

Un article de Wikipédia, l'encyclopédie libre.
Aller à : Navigation, rechercher
Page d'aide sur l'homonymie Ne doit pas être confondu avec batch ou bâche.
Bourne-Again shell
Bash-org.jpg
Bash screenshot.png
Session de travail avec Bash
Dernière version 4.1 (2 janvier 2010) [+/-]
Environnement Multiplate-forme
Type Shell Unix
Licence GNU GPL
Site Web Page officielle

Bash, acronyme de Bourne-again shell, est le shell du projet GNU. Son nom est un jeu de mots sur le nom du shell historique d'Unix, le Bourne shell. Littéralement, Bourne again signifie « Bourne encore », mais se prononce également presque comme born again, signifiant « né de nouveau » ou encore « réincarné ». Également, to bash signifie « frapper violemment » en anglais.

Basé sur le Bourne shell, Bash lui apporte de nombreuses améliorations, provenant notamment du Korn shell et du C shell. Bash est un logiciel libre publié sous GNU GPL. Il est l'interprète par défaut sur de nombreux Unix libres, notamment sur les systèmes GNU/Linux. C'est aussi le shell par défaut de Mac OS X et il a été porté sous Windows par le projet Cygwin.

Sommaire

[modifier] Histoire

Brian Fox, en 1988, a publié la première implémentation de Bash pour le compte de la Free Software Foundation. Il a été relayé plus tard par Chet Ramey.

Le Bourne shell originel, dont s'inspire Bash, fut écrit par Stephen Bourne en 1977.

[modifier] Usage

Comme tous les interpréteurs en ligne de commande de type script, Bash exécute quatre opérations fondamentales :

  1. Il fournit une liste de commandes permettant d'opérer sur l'ordinateur (lancements de programmes, copies de fichiers…) ;
  2. Il permet de regrouper ces commandes dans un fichier unique, appelé script ;
  3. Il vérifie la ligne de commande lors de son exécution ou lors d'une éventuelle procédure de vérification, et renvoi un message d'erreur en cas d'erreur de syntaxe ;
  4. En cas de validation, chaque ligne de commande est interprétée, c'est-à-dire traduite dans un langage compréhensible par le système d'exploitation, qui l'exécute alors.

Les scripts sont de courts programmes généralement faciles à construire. Bash offre un service de gestion de flux, c'est-à-dire qu'il permet que le résultat d'un script (la sortie) soit transmis à un autre script (l'entrée). De cette façon, les scripts peuvent être « chaînés », chacun effectuant une seule tâche bien délimitée.

Les scripts peuvent être exécutés manuellement par l'utilisateur ou automatiquement par le système. Par exemple, dans la distribution Linux Ubuntu, le répertoire resume.d contient un certain nombre de scripts qui s'exécutent automatiquement lors du redémarrage du système, c'est-à-dire après la fin de la mise en veille de celui-ci. Ces scripts servent à relancer les différents programmes interrompus par la mise en veille.

[modifier] Fonctionnement interactif

Bash est un shell interactif, c'est-à-dire qu'il attend des commandes, données par un utilisateur, puis retourne le résultat de ces commandes et se place à nouveau en situation d'attente. Pour pouvoir donner des commandes à Bash, l'utilisateur doit ouvrir une session.

[modifier] Session

Une « session » est l'ensemble des actions effectuées par l'utilisateur d'un système informatique, entre le moment où il se connecte à celui-ci et le moment où il s'en déconnecte.

[modifier] Ouverture

Pour pouvoir ouvrir une session sur Bash, il faut être un utilisateur connu du système. Lorsque Bash est en attente d'une connexion, il affiche le nom de la machine sur laquelle il se trouve suivi de login:. L'utilisateur indique alors son nom, Bash retourne Password: pour demander le mot de passe de l'utilisateur. Au bout d'un certain temps, souvent une minute, si rien n'est tapé, Bash revient à la première invite. Sinon, à condition que mot de passe soit correct, il ouvre une session et affiche une invite de commande, couramment désignée sous le terme de « prompt ». Contrairement à ce qui se passe lorsque le nom d'utilisateur est saisi, le mot de passe ne s'affiche pas à l'écran par souci de sécurité.

Opérations Explications
bokken login: rms Bash est en attente d'une connexion sur la machine nommée bokken, l'utilisateur indique son nom, rms.
Password: L'utilisateur fournit son mot de passe.
rms@bokken:~$ Bash affiche l'invite de commande, il attend qu'on lui donne des tâches à effectuer.

[modifier] Fermeture

La fermeture de session se fera par la commande exit ou Ctrl+D (la marque de fin de fichier sous Unix : l'utilisateur ferme le flux de lecture de l'interpréteur).

[modifier] Scripts de connexion et de déconnexion

Il s'agit de scripts exécutés lors de la connexion ou de la déconnexion d'un utilisateur.

Scripts exécutés lors de la connexion :

Script exécuté lors de la déconnexion :

.bashrc est spécifique à Bash. Ce script est exécuté par les shells interactifs autres que les shells de connexion, par exemple lorsqu'on lance un shell dans un shell déjà existant.

[modifier] readline et l'édition de la ligne de commande

Bash utilise la bibliothèque readline ce qui lui permet, comme le C shell, de compléter automatiquement (autocomplétion) les noms de commandes et de fichiers lors d'une frappe sur la touche TAB, et d'accélèrer considérablement le travail. Les touches UP et DOWN permettent de naviguer avec facilité dans l'historique des commandes.

[modifier] Édition de la ligne de commande en mode vi ou Emacs

Il est également possible de choisir pour l'édition de la ligne de commande un comportement similaire à celui de l'éditeur de texte vi ou à celui de Emacs. Il faut alors utiliser les commandes set -o et set +o qui modifient les options du shell. Leur comportement est contre-intuitif car set -o active une option, tandis que set +o la désactive.

set -o emacs lance l'édition de ligne de commande en mode emacs et set -o vi en mode vi. Depuis la version 2.0, une nouvelle commande interne a été ajoutée pour la configuration du comportement du shell : shopt. Elle est destinée à remplacer la configurations des options par set. Le fonctionnement de shopt -o est semblable à set -o et celui de shopt +o à celui de set +o pour assurer la continuité avec set.

[modifier] Interprétation et exécution des commandes

Pour interpréter une ligne, Bash la segmente en mots. Le premier mot d'une ligne est considéré comme un nom de commande. On place ensuite les « arguments », qu'on nomme aussi les « paramètres » de la commande, c'est-à-dire les données qu'elle va traiter, un fichier par exemple. Enfin on peut ajouter des « options » qui vont modifier le comportement standard de la commande. Ces options sont introduites par « - », le tiret court, puis par le nom de l'option, ou une simple lettre en guise de raccourci. On ne place pas d'espace entre le tiret et le nom de l'option.

[modifier] Interprétation

Chaque interprétation d'une ligne respecte les contraintes suivantes :

Il existe plusieurs types de noms de commande associés à différents degrés de priorité. En suivant l'ordre décroissant des priorités, lors de l'interprétation de ce premier mot, on trouve :

Si Bash ne trouve aucune correspondance dans les alias, les commandes internes ou les commandes externes avec le premier mot de la ligne, il renvoie un message d'erreur en faisant précéder command not found du mot tapé en tête de ligne.

[modifier] Exécution

Dans le cas d'une commande externe, le shell doit retrouver le programme correspondant à cette commande avant de pouvoir l'exécuter. Une recherche exhaustive, pour chaque commande, dans tout le système de fichiers prendrait beaucoup trop de temps et rendrait le système inutilisable dans la pratique. Seul un petit ensemble de répertoires est en fait consulté lors de la recherche du programme permettant l'exécution de la commande. Ces répertoires sont définis dans une variable d'environnement appelée « $PATH ». Si la commande n'est pas trouvée dans l'un des répertoires listés dans cette variable, « le PATH », l'exécution se solde par un message d'erreur du type command not found.

Contrairement à ce qui se passe sous Windows, pour des raisons de sécurité, les shells Unix, dont Bash, n'incluent pas implicitement le répertoire courant dans le PATH, mais il peut y être placé explicitement. Cela permet d'éviter qu'un individu n'installe dans le répertoire courant un programme malveillant qui, portant le même nom qu'une commande externe, pourrait s'exécuter à sa place si un utilisateur tapait cette commande.

[modifier] Syntaxe

[modifier] Les métacaractères du shell

Un métacaractère est un caractère qui possède une signification autre que sa signification littérale. « * » ne représente pas pour Bash le caractère étoile, il le lit comme représentant n'importe quelle suite de caractère ou une absence de caractère. Les métacaractères se divisent en deux classes, ceux qui se substituent à d'autres caractères et ceux qui permettent de protéger des caractères. Ces derniers, employés seuls comme dans le cas de l'anti-slash, ou par paires, forcent Bash à lire des caractères de façon littérale, c'est-à-dire que s'il est protégé, le caractère « * » perd son statut de métacaractère pour redevenir une « étoile ».

Il y a deux métacaractères de substitution :

  1. * : correspond à aucun caractère, n'importe quel caractère ou un ensemble de caractères ;
  2.  ? : est équivalent à un caractère quelconque.

Il y a trois moyens pour protéger un caractère ou une chaîne de caractères :

  1. \ : empêche l'interprétation spéciale d'un métacaractère ;
  2. ` : les guillemets inversés (backquotes, touches AltGr+7 sur un clavier français) provoquent une interprétation de la chaîne de caractères incluse entre deux de ces caractères comme une commande. Exemple : for file in `ls` ;
  3. ' : tous les caractères inclus entre deux de ces caractères sont interprétés comme du texte.

[modifier] Le caractère d'échappement : anti-slash « \ »

[modifier] Anti-slash en fin de ligne

À la fin d'une ligne, un anti-slash indique que la commande continue à la ligne suivante. Cette fonction est particulièrement utile pour les grandes commandes afin de les rendre plus facilement lisibles.

[modifier] Anti-slash pour former un des caractères spéciaux du C

Les chaînes ayant un format analogue à $'\n', dans lesquelles on note la présence de l'anti-slash, sont interprétées d'une façon particulière par Bash. On remarque que l'anti-slash est suivi d'une lettre et que le groupe est encadré par des apostrophes. Dans ce cas, il ne s'agit pas d'échapper la signification d'un métacaractère. C'est une façon d'indiquer à Bash que la combinaison de l'anti-slash et de la lettre représente un caractère spécial du langage C à interpréter selon les règles édictées par l'ANSI. Ainsi 'echo $'\a' provoquera un bip sonore.

Le tableau qui suit donne la liste de ces caractères spéciaux :

Échappement
par antislash
Transformation par Bash
\a Bip sonore
\b Espacement arrière
\e Échappement
\f Saut de page (le nom anglais de ce caractère est form feed)[note 1]
\n Saut de ligne
\r Retour chariot
\t Caractère de tabulation horizontale
\v Caractère de tabulation verticale
\\ Anti-slash
\' Une apostrophe (le nom anglais de ce caractère est quote)
\nnn Le caractère 8 bits dont la valeur en octal est nnn
\xHH Le caractère 8 bits dont la valeur en hexadécimal est HH
\cx Le caractère contrôle-X

Voir ASCII

[modifier] Anti-slash avant un des méta-caractères de Bash

Les méta-caractères, notamment « * » (étoile), ne sont pas interprétés par Bash en tant que littéraux, ce qui est gênant dans certains cas. Les commandes find[note 2], sed exemplifient ce point délicat. Si à l'aide de la commande find on souhaitait chercher dans le répertoire courant, représenté par « . », et ses sous-répertoires, tous les fichiers dont le nom commence par « my », on serait tenté d'écrire ligne de commande suivante find . -name my* Mais la commande renverra Find: Les chemins doivent précéder l'expression.

En effet Bash va substituer à la chaîne « my* » la liste des fichiers contenus dans le répertoire courant, ce que find considère comme étant une liste de chemins, qui doivent être spécifiés en premier lieu, et non comme le nom des fichiers à rechercher.

Une des solutions consiste à utiliser un anti-slash avant le caractère « * » pour l'échapper et forcer Bash à l'interpréter comme un littéral. Ce qui donne cd /etc;find . -name my\*.

Une autre solution serait d'utiliser les guillemets. On pourrait par exemple écrire cd /etc;find . -name "my*"

[modifier] Gestion de processus [1]

Commandes Opérations Explications
A &
Crée un nouveau processus en lançant
la commande A (indépendante de la console).
A && B
ET logique (&&) Exécute B, si A réussit.
A || B
OR (||) Exécute B uniquement si A échoue.
A `B`
paramètres dynamiques A utilise les résultats de l'exécution de B
A $(B)

[modifier] Gestion de flux

Chaque commande est associée à trois flux :

  1. l'entrée (ou « input » ou encore stdin) standard (entrée 0) ;
  2. la sortie (ou « output » ou encore stdout) standard (entrée 1) ;
  3. la sortie d'erreur standard (stderr) (entrée 2)

Éventuellement, des descripteurs de fichier supplémentaires peuvent être associés à une commande.

Méthode d'utilisation :

Commandes Opérations Explications
A > fichier
sortie (>) Exécute la commande A et redirige sa sortie standard (stdout) dans fichier en écrasant son contenu ou en créant fichier si celui-ci n'existe pas
A >> fichier
sortie (>>) Exécute la commande A et redirige sa sortie standard à la fin de fichier
A 2> fichier
sortie (2>) Exécute la commande A et redirige sa sortie standard des erreurs (stderr) dans fichier en écrasant son contenu ou en créant fichier si celui-ci n'existe pas
A 2>> fichier
sortie (2>>) Exécute la commande A et redirige sa sortie standard des erreurs à la fin de fichier
A 2>&1
sortie (2>&1) Exécute la commande A et redirige sa sortie standard des erreurs dans sa sortie standard
A < fichier
entrée (<) Exécute la commande A en lui passant le contenu de fichier dans son entrée standard (stdin)
A | B
sortie, entrée(|) Exécute A et envoie le contenu de sa sortie standard dans l'entrée standard de B

[modifier] Redirection de l'entrée et des deux sorties

Utiliser

[modifier] Variables du shell

Les variables sont référencées en les faisant précéder par le signe $ (exemple echo $HOME).

Quelques variables d'environnement : USER, PID, HOME, PATH et SHELL

[modifier] Substitution de commandes

Dans une ligne de commande, on remplace comme argument une commande par son résultat (au stdout) en l'entourant d'apostrophes inversées `nom commande` ou encore en utilisant $() ($(nom commande)).

[modifier] Expression rationnelle

Les expressions rationnelles ou expressions régulières permettent de décrire des chaînes de caractères. On peut discerner deux catégories parmi ces derniers. Les littéraux, qui sont des caractères normaux traités comme tels, et les métacaractères qui sont des symboles ayant un sens pour une recherche. Il a déjà été question au-dessus des caractères * et ?. Il est possible d'affiner la description du motif que l'on recherche et de préciser son emplacement.

Ainsi ^ représente le début d'une ligne et $ la fin. Par exemple ^ter représente toutes les lignes commençant par ter et ter$ toutes celles se terminant par ter.

Des métacaractères réprésentent aussi des classes de caractères. Par exemple dans sci[ea]nce le contenu des crochets représente un OU logique. Sont représentées science et sciance. À l'aide des crochets, il est aussi possible de définir des intervalles, il faut ajouter un tiret. Il s'ensuit que [0-9] équivaut à tous les chiffres de 0 à 9, [a-z] à toutes les lettres minuscules et [A-Z] à toutes les lettres majuscules. À l'intérieur des crochets, plusieurs classes de caractères peuvent être combinées : par exemple, epsilon[0-9A-Z] spécifie que epsilon peut être suivi d'un chiffre entre 0 et 9 ou d'une lettre majuscule.

Le ^ à l'intérieur des crochets signifie la négation. De la sorte [^eo] (^ est le deuxième caractère) définit ni « e » ni « o ».

Les expressions entre crochets ne permettent pas de décrire une chaîne de caractères, elles ne correspondent qu'à un seul caractère. Pour décrire une chaîne, il faut utiliser les parenthèses, lesquelles constituent une sous-expression régulière. Le tube | indique alors les alternatives. lou(p|ch)er décrit aussi bien louper que loucher.

[modifier] Raccourcis clavier

[modifier] Notes et références

Notes
  1. Pour le saut de page, voir (en) Page break
  2. (en) find
Références
  1. Quick Reference Bash

[modifier] Voir aussi

Sur les autres projets Wikimédia :

[modifier] Articles connexes

[modifier] Liens externes

Ce document provient de « http://fr.wikipedia.org/wiki/Bourne-Again_shell ».
Outils personnels
Espaces de noms
Variantes
Actions
Navigation
Contribuer
Imprimer / exporter
Boîte à outils
Autres langues