Bourne-Again shell 792040 31754072 2008-07-21T10:37:08Z Sylphe 1354 Ajout d'un titre de sous-section {{confusion|batch}} {{Infobox Logiciel | nom = Bourne-Again shell | logo = | image = [[Image:Bash screenshot.png|200 px]] | description = Session de travail avec Bash | développeur = | dernière version = 3.2.33 | date de dernière version = {{date|15|décembre|2007}} | version avancée = | date de version avancée = | environnement = [[Multiplate-forme]] | langue = | type = [[Shell Unix]] | licence = [[Licence publique générale GNU|GNU GPL]] | site web = [http://tiswww.case.edu/php/chet/bash/bashtop.html Page officielle] }} '''Bash''', acronyme de ''Bourne-again shell'', est le [[shell (informatique)|shell]] du projet [[GNU]]. Son nom est un jeu de mots sur le nom du ''shell'' historique d'[[Unix]], le [[Bourne shell]] : ''Bourne again'', ou ''born again'', signifie « né de nouveau » ou encore « réincarné ». Basé sur ce dernier, il apporte de nombreuses améliorations, provenant notamment du [[Korn shell]] et du [[csh|C shell]]. Bash est un [[logiciel libre]] publié sous [[Licence publique générale GNU|GNU GPL]]. Il est l'[[Interprète (informatique)|interprète]] par défaut sur de nombreux [[Unix]] libres, notamment sur les systèmes [[Linux|GNU/Linux]]. C'est aussi le shell par défaut de [[Mac OS X]] et il a été porté sous [[Microsoft Windows|Windows]] par le projet [[Cygwin]]. == Histoire == Son auteur original est [[Brian Fox]] de la [[Free Software Foundation]], relayé plus tard par [[Chet Ramey]]. Le [[Bourne shell]] original fut écrit par [[Steve Bourne]]. == Fonctionnement interactif == Bash utilise la [[Bibliothèque logicielle|bibliothèque]] [[readline]] ce qui lui permet, comme le C shell, de [[Complètement|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. == 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é: # un <em>alias</em> : 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. # une commande <em>interne</em> : 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" (<em>change directory</em>) ou "set" sont des commandes internes du shell. # une commande <em>externe</em>, c'est-à-dire un programme (ou un fichier de commande, en général appelé <em>script</em>) stocké sur le disque de la machine. Par exemple, <code>/bin/ls</code> est la commande qui permet de lister les fichiers contenus dans un répertoire donné. Chaque commande respecte les contraintes suivantes : # le <em>premier</em> mot de la ligne est interprété comme le <em>nom</em> de la commande, les autres mots en sont les paramètres ou options ; # chaque mot est séparé par un ou plusieurs <em>caractères de séparation</em>. Par défaut, ces caractères sont l'espace et la tabulation (modifiable grâce à la [[variable]] [[Internal Field Separator|IFS : Internal Field Separator]]) ; # 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 <code>exit</code> 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 (<tt>stdin</tt>) * Une sortie standard (<tt>stdout</tt>) * Une sortie d'erreur (<tt>stderr</tt>) Éventuellement, des [[descripteur de fichier|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<ref>http://tldp.org/LDP/abs/html/x15466.html</ref>. Quelques exemples au niveau des expressions rationnelles dans Bash : * "*" : correspond à n'importe quel caractère, répété 0, 1 ou plusieurs fois. * "?" : est équivalent à un caractère quelconque. Et d'autres au niveau des commandes Bash : * "`" : interprète la chaîne de caractères incluse entre deux de ces caractères comme une commande. Exemple : <code>for file in `ls`</code> ; * "\" : 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 <ref>[http://www.abrillant.com/doc/linux/index.html Quick Reference Bash<!-- Titre généré automatiquement -->]</ref>=== {| class=wikitable ! Commandes ! Opérations ! Explications |---- |<pre>A &</pre> | |Crée un nouveau processus lançant la commande A (indépendante de la console). |---- |<pre>A && B</pre> |[[Conjonction logique|ET logique]] ('''&&''') |Exécute B, '''si''' A '''réussit'''. |---- |<pre>A || B</pre> |[[Fonction_OU|OR]] (&#124;&#124;) |Exécute B uniquement '''si''' A '''échoue'''. |---- |<pre>A `B`</pre> |rowspan=2|paramètres dynamiques |rowspan=2|A '''utilise les résultats''' de l'éxécution de B |---- |<pre>A $(B)</pre> |} === Gestion de flux === Il existe trois flux majeurs : # l'entrée (ou « ''input'' ») standard (entrée 0) ; # la sortie (ou « ''output'' ») standard (entrée 1) ; # la sortie d'erreur standard (entrée 2) Méthode d'utilisation : {| class=wikitable ! Commandes !Opérations ! Explications |---- |<pre>A > fichier</pre> |sortie ('''>''') |Exécute la commande A et écrit les résultats dans ''fichier'' |---- |<pre>A 2> fichier</pre> |sortie ('''2>''') |Exécute la commande A et écrit les erreurs dans ''fichier'' |---- |<pre>A > fichier 2>&1</pre> |sortie ('''>''' et '''2>&1''') |Exécute la commande A et écrit les résultats et les erreurs dans ''fichier'' |---- |<pre>A < fichier</pre> |entrée ('''<''') |Exécute la commande A et propose le ''fichier'' comme des entrées de A. |---- |<pre>A | B</pre> |sortie, entrée('''&#124;''') |Exécute A et envoie ses résultats comme entrée 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 n<sup>ième</sup> 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 [[variable d'environnement|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]] === {{...}} === Caractère d'échappement [[Barre oblique inversée|anti-slash]] ("\") === ==== Anti-slash en fin de ligne ==== À la fin d'une ligne, un [[Barre oblique inversée|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 (langage)|C]] ==== Les chaînes ayant un format analogue à <tt>$'\n'</tt> 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 (langage)|C]] [[American National Standards Institute|ANSI]]. Exemple : ''echo $'\a' # Provoquera un bip sonore. Voici la liste : {| class="wikitable" |- ! Échappement<br>par antislash !! Transformation par l'interpréteur bash |- | align="center" | <tt>\a</tt> || Bip sonore |- | align="center" | <tt>\b</tt> || Espacement arrière |- | align="center" | <tt>\e</tt> || Échappement |- | align="center" | <tt>\f</tt> || Saut de page (le nom anglais de ce caractère est ''form feed'')<ref>Pour le saut de page, voir {{en}} [[:en:Page break|Page break]]</ref> |- | align="center" | <tt>\n</tt> || [[Saut de ligne]] |- | align="center" | <tt>\r</tt> || [[Retour chariot]] |- | align="center" | <tt>\t</tt> || Caractère de tabulation horizontale |- | align="center" | <tt>\v</tt> || Caractère de tabulation verticale |- | align="center" | <tt>\\</tt> || Anti-slash |- | align="center" | <tt>\'</tt> || Une apostrophe (le nom anglais de ce caractère est ''quote'') |- | align="center" | <tt>\nnn</tt> || Le caractère 8-bits dont la valeur en octal est nnn |- | align="center" | <tt>\xHH</tt> || Le caractère 8-bits dont la valeur en hexadécimal est HH |- | align="center" | <tt>\cx</tt> || Le caractère contrôle-X |} Voir [[American Standard Code for Information Interchange|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''<ref>{{en}} [[:en:find|find]]</ref>, [[sed (logiciel)#Utilisation|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 ** <tt>/etc/profile</tt> * Spécifique à chaque utilisateur ** <tt>.bash_profile</tt> ** <tt>.bash_login</tt> ** <tt>[[profil utilisateur|.profile]]</tt> Scripts de déconnexion * <tt>.bash_logout</tt> Script pour les shell interactifs autres que les scripts de connexion : * <tt>.bashrc</tt> == Références == <references/> == Voir aussi == {{Wikibooks|Programmation Bash}} === Articles connexes === * [[Shell (informatique)|Shell]] * [[Shell_Unix|Shell Unix]] * [[Commandes Unix]] === Liens externes === * {{en}} [http://tiswww.case.edu/php/chet/bash/bashtop.html Page] de l'auteur * {{en}} [http://www.gnu.org/software/bash/ Page] sur le site du projet GNU * {{en}} [http://www.abrillant.com/doc/linux/index.html Tutorial Bash] * {{fr}} [http://www.labo-linux.org/index.php?page=essentiels&id=472 Labo-Linux : Scripting Bash] * {{fr}} [http://www.linux-france.org/article/man-fr/man1/bash-1.html Page du manuel] * {{fr}} [http://aral.iut-rodez.fr/fr/sanchis/enseignement/bash/index.html Introduction à la programmation en Bash] * {{fr}} [http://www.c-sait.net/cours/bash.php Utiliser Bash] * {{fr}} [http://abs.traduc.org Guide avancé d'écriture de scripts en Bash] {{Navigation shell}} {{GNU}} {{Portail logiciels libres}} [[Catégorie:Langage de script]] [[Catégorie:Logiciel libre]] [[Catégorie:Shell Unix]] [[Catégorie:Logiciel du projet GNU]] [[ar:باش]] [[bg:Bash]] [[bs:Bash]] [[ca:Bash]] [[cs:Bash]] [[de:Unix-Shell#Die Bourne-Again-Shell]] [[en:Bash]] [[eo:Bash]] [[es:Bash]] [[fi:Bash]] [[gl:Bash]] [[he:Bourne-again shell]] [[hr:Bash]] [[hu:Bash]] [[it:Bash]] [[ja:Bash]] [[ko:본 어게인 셸]] [[ms:Bash]] [[nl:Bash]] [[pl:Bash]] [[pt:Bash]] [[ru:Bash]] [[sh:Bash]] [[sk:Bash]] [[sr:Баш]] [[sv:Bash]] [[th:Bash]] [[tr:Bash]] [[zh:Bash]]