GNU Bash

GNU Bash

Bourne-Again shell

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.0 (le 20 février 2009) [+/-]
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é ». Notons également que to bash signifie "frapper violemment" en anglais.

La fonction d'un shell est de gérer une interface en ligne de commandes, plus spécifiquement de chaîner des listes de commandes dans le cadre d'un fichier de script, lequel automatise le lancement de ces commandes multiples.

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

Histoire

L'auteur originel du Bourne-Again shell (bash) est en 1988 Brian Fox, de la Free Software Foundation, relayé plus tard par Chet Ramey.

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

Usage de Bash

Comme tous les interpréteurs en ligne de commande de type script, bash fait quatre opérations fondamentales :

  • Il fournit une liste de commandes permettant d'opérer sur l'ordinateur (lancements de programmes, copies de fichiers, ...).
  • Il permet de regrouper ces commandes dans un fichier unique, appelé script.
  • 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.
  • 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.

L'intérêt fondamental de bash et des autres langages de script, est de faire exécuter séquentiellement (les unes après les autres) des commandes lors du lancement du script, qu'on peut alors considérer comme un petit programme.

Les scripts peuvent être exécutés manuellement, ou être lancés automatiquement par le système. Ainsi par exemple, dans la distribution Linux Ubuntu, le répertoire resume.d contient un certains 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 à redémarrer différents programmes interrompus par la mise en veille.

Fonctionnement interactif

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

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. On utilise pour ce faire la commande 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, set -o vi en mode vi. Dans le bash 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 ainsi shopt -o est semblable à set -o et shopt +o à set +o pour assurer la continuité avec set.

Langage de commande

Le premier mot de la ligne est donc considéré par l'interprète comme un nom de commande. Mais il en existe de plusieurs sortes, avec différents types de priorité. Dans l'ordre décroissant de priorité:

  1. un alias : c'est un mot défini comme synonyme d'un autre (groupe de) mot(s). Dans ce cas, l'interprète commence par remplacer le mot par son équivalent.
  2. une commande interne : c'est une commande qui a été définie dans l'interprète lui-même, elle ne fait pas l'objet d'un programme séparé. Par exemple, les commandes "cd" (change directory) ou "set" sont des commandes internes du shell.
  3. une commande externe, c'est-à-dire un programme (ou un fichier de commande, en général appelé script) stocké sur le disque de la machine. Par exemple, /bin/ls est la commande qui permet de lister les fichiers contenus dans un répertoire donné.

Chaque commande respecte les contraintes suivantes :

  1. le premier mot de la ligne est interprété comme le nom de la commande, les autres mots en sont les paramètres ou options ;
  2. chaque mot est séparé par un ou plusieurs caractères de séparation. Par défaut, ces caractères sont l'espace et la tabulation (modifiable grâce à la variable IFS : Internal Field Separator) ;
  3. la fin de la commande est marquée, soit par un ";" (si l'on veut placer plusieurs commandes sur la même ligne), soit par un saut de ligne.

$PATH

Dans le cas d'une commande externe, le shell doit retrouver le programme 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 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 shell UNIX (et donc bash) n'incluent pas implicitement le répertoire courant dans le PATH, mais il peut y être placé explicitement.

Session

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

Syntaxe

Chaque commande est associée à

  • Une entrée standard (stdin)
  • Une sortie standard (stdout)
  • Une sortie d'erreur (stderr)

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

Les métacaractères du shell

Un métacaractère est un caractère qui possède une signification au-delà de sa signification littérale. Quelques exemples au niveau des expressions rationnelles dans Bash :

  • * : correspond à n'importe quel caractère ou ensemble de caractères.
  •  ? : est équivalent à un caractère quelconque.

Et d'autres au niveau des commandes Bash :

  • ` : les guillemets inversés (backquotes touches AltGr+7 sur un clavier français) provoque 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` ;
  • \ : empêche l'interprétation spéciale d'un métacaractère ;
  • ' : tous les caractères inclus entre deux de ces caractères sont interprétés comme simple texte.

Gestion de processus [1]

Commandes Opérations Explications
A &
Crée un nouveau processus 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'éxécution de B
A $(B)

Gestion de flux

Il existe 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)

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

Redirection de l'entrée et des 2 sorties

  • on utilise > pour faire la redirection de la sortie standard (stdout) d'une commande
  • 2> pour la redirection de la sortie 'des erreurs' (stderr)

d'une manière générale n> permet la redirection du nième descripteur de fichier

  • &> pour rediriger en même temps la sortie standard et la sortie erreur :

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 SHELL

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)

Expression rationnelle

Article détaillé : Expressions rationnelles.

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 numéros de 0 à 9, [a-z] à toutes les lettres minuscules et [A-Z] à toutes les lettres majuscules. Bien sûr à l'intérieur des crochets on peut combiner plusieurs classes de caractères bilboard[0-9A-Z] spécifie que bilboard peut être suivi d'un chiffre entre 0 et 9 et d'une lettre majuscule.

Le ^ à l'intérieur des crochets ne signifie pas le début d'une ligne, mais la négation. De la sorte [^eo] 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, on utilisera les parenthèses, qui en fait constituent une sous-expression régulière. Le pipe | indique alors les alternatives. lou(p|ch)er décrit aussi bien louper que loucher.

Raccourcis clavier

  • TAB : auto-complète un mot à partir de la position du curseur.
  • CTRL + a : déplace le curseur en début de ligne (équivalent à la touche début).
  • CTRL + e : (end) déplace le curseur en fin de ligne (équivalent à la touche fin).
  • CTRL + p : (previous) rappelle la commande précédente (équivalent à la touche flèche du haut).
  • CTRL + n : (next) rappelle la commande suivante (équivalent à la touche flèche du bas).
  • CTRL + r : (research) rappelle la dernière commande contenant les caractères spécifiés (équivalent à vim ~/.bash_history). Un 2ème CTRL + r rappelle la prochaine commande antérieure correspondant à la recherche. CTRL + s : rappelle la commande suivante de la recherche (attention à ne pas l'exécuter depuis un terminal car cette commande déclencherait son XOFF). CTRL + o : exécute la commande trouvée dans la recherche.
  • CTRL + l : efface le contenu de l'écran (équivalent à la commande clear).
  • CTRL + u : efface le contenu de la ligne avant le curseur et le place dans le presse-papier.
  • CTRL + k : efface le contenu de la ligne après le curseur et le place dans le presse-papier.
  • CTRL + w : efface le mot avant le curseur et le place dans le presse papier.
  • CTRL + y : (yank) ajoute le contenu du presse-papier à partir de la position du curseur.
  • CTRL + d : ferme le shell courant (équivalent de la commande exit).
  • CTRL + c : envoie le signal SIGINT à la tâche au premier plan, ce qui a pour effet de l'interrompre.
  • CTRL + z : envoie le signal SIGTSTP à la tâche au premier plan ce qui a pour effet de la suspendre. Pour la réafficher on peut entrer fg 'nom du processus'.
  • CTRL + x CTRL + x : (car x est en forme de croisement) alterne le curseur avec son ancienne position.
  • CTRL + x CTRL + e : (editor car reprend la variable $EDITOR du shell) édite la ligne courante dans vi.
  • ALT + f : (forward) avance le curseur d'un mot.
  • ALT + b : (backward) recule le curseur d'un mot.
  • ALT + del : coupe le mot avant le curseur.
  • ALT + d : couper le mot après le curseur.
  • ALT + u : transforme le mot courant en majuscules à partir du curseur et avance d'un mot.
  • ALT + l : transforme le mot courant en minuscules à partir du curseur et avance d'un mot.
  • ALT + c : met la lettre sous le curseur en majuscule et avance d'un mot.
  • ALT + r : annule les changements et remet la ligne telle qu'elle était dans l'historique.

Caractère d'échappement anti-slash ("\")

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.

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

Les chaînes ayant un format analogue à $'\n' sont interprétées d'une façon particulière par le bash. Elles sont transformées en conformité avec les règles du C ANSI. Exemple :

echo $'\a' # Provoquera un bip sonore.

Voici la liste :

Échappement
par antislash
Transformation par l'interpréteur bash
\a Bip sonore
\b Espacement arrière
\e Échappement
\f Saut de page (le nom anglais de ce caractère est form feed)[2]
\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

Anti-slash avant un des meta-caractères du bash

Les meta-caractères, notamment "*" (étoile), sont interprétés par l'interpréteur bash (le plus souvent remplacement par d'éventuels fichiers), ce qui est gênant dans certains cas (commande find[3], sed, ...etc); exemple :

cd /etc;find . -name r* 
Le message d'erreur sera
Find: Les chemins doivent précéder l'expression

Une des solutions est d'utiliser un anti-slash avant le caractère "*". Exemple :

cd /etc;find . -name r\*

Remarque

Une autre solution serait d'utiliser les guillemets. Exemple
cd /etc;find . -name "r*"

Éventuels scripts de démarrage et de déconnexion

Script exécuté lors de la connexion

  • Commun à tous les utilisateurs
    • /etc/profile
  • Spécifique à chaque utilisateur

Scripts de déconnexion

  • .bash_logout

Script pour les shell interactifs autres que les scripts de connexion :

  • .bashrc

Références

  1. Quick Reference Bash
  2. Pour le saut de page, voir (en) Page break
  3. (en) find

Voir aussi

Wikibooks-logo-fr.png

Wikibooks propose un ouvrage abordant ce sujet : Programmation Bash.

Articles connexes

Liens externes

  • Portail des logiciels libres Portail des logiciels libres
Ce document provient de « Bourne-Again shell ».

Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article GNU Bash de Wikipédia en français (auteurs)

Игры ⚽ Поможем решить контрольную работу

Regardez d'autres dictionnaires:

  • GNU Bash — …   Википедия

  • Bash — Saltar a navegación, búsqueda bash Captura de pantalla de una sesión bash, tomada en GNU/Linux. Desarrollador …   Wikipedia Español

  • GNU Rush — Développeur Projet GNU Dernière version …   Wikipédia en Français

  • GNU — Famille Type Unix Langue Multilingue Type de noyau Micronoyau …   Wikipédia en Français

  • GNU's Not UNIX — GNU GNU Famille Type Unix Type de noyau …   Wikipédia en Français

  • GNU/Hurd — GNU GNU Famille Type Unix Type de noyau …   Wikipédia en Français

  • Gnu — Famille Type Unix Type de noyau …   Wikipédia en Français

  • GNU GLOBAL — Code source du noyau Linux 2.6.18 …   Wikipédia en Français

  • GNU Readline — Développeur Projet GNU Dernière version …   Wikipédia en Français

  • GNU Core Utilities — Développeur projet GNU Dernière version …   Wikipédia en Français

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”