Articles

Bash (shell Unix)

La syntaxe de la commande Bash est un surensemble de la syntaxe de la commande Bourne shell. Bash prend en charge l’extension des accolades, l’achèvement de la ligne de commande (Achèvement programmable), le débogage de base et la gestion du signal (en utilisant trap) depuis bash 2.05a entre autres fonctionnalités. Bash peut exécuter la grande majorité des scripts shell Bourne sans modification, à l’exception des scripts shell Bourne trébuchant dans un comportement syntaxique marginal interprété différemment dans Bash ou tentant d’exécuter une commande système correspondant à une version intégrée de Bash plus récente, etc. La syntaxe de commande Bash inclut des idées tirées de la commande KornShell (ksh) et du shell C (csh) telles que l’édition de ligne de commande, l’historique des commandes (commande history), la pile de répertoires, les variables $RANDOM et $PPID et la syntaxe de substitution de commande POSIX $(…).

Lorsqu’un utilisateur appuie sur la touche tab dans un shell de commande interactif, Bash utilise automatiquement l’achèvement de la ligne de commande, depuis la version bêta 2.04, pour faire correspondre les noms de programmes, les noms de fichiers et les noms de variables partiellement typés. Le système de complétion en ligne de commande Bash est très flexible et personnalisable, et est souvent emballé avec des fonctions qui complètent les arguments et les noms de fichiers pour des programmes et des tâches spécifiques.

La syntaxe de Bash a de nombreuses extensions manquantes dans le shell Bourne. Bash peut effectuer des calculs d’entiers (« évaluation arithmétique ») sans générer de processus externes. Il utilise la commande ((…)) et la syntaxe de variable $((…)) à cet effet. Sa syntaxe simplifie la redirection d’E/S. Par exemple, il peut rediriger la sortie standard (stdout) et l’erreur standard (stderr) en même temps en utilisant l’opérateur &>. C’est plus simple à taper que l’équivalent du shell Bourne ‘command > file 2>&1‘. Bash prend en charge la substitution de processus en utilisant la syntaxe <(command) et >(command), qui remplace la sortie (ou l’entrée) d’une commande où un nom de fichier est normalement utilisé. (Ceci est implémenté via /proc/fd/tuyaux sans nom sur les systèmes qui le supportent, ou via des tuyaux nommés temporaires si nécessaire).

Lors de l’utilisation du mot-clé ‘function’, les déclarations de fonction Bash ne sont pas compatibles avec les scripts Bourne/Korn/POSIX (le KornShell a le même problème lors de l’utilisation de ‘function’), mais Bash accepte la même syntaxe de déclaration de fonction que les shells Bourne et Korn, et est conforme à POSIX. En raison de ces différences et d’autres, les scripts shell Bash sont rarement exécutables sous les interpréteurs shell Bourne ou Korn, à moins d’être écrits délibérément avec cette compatibilité à l’esprit, ce qui devient de moins en moins courant à mesure que Linux se généralise. Mais en mode POSIX, Bash est plus conforme à POSIX.

Bash prend en charge les documents ici. Depuis la version 2.05b, Bash peut rediriger l’entrée standard (stdin) d’une « chaîne ici » en utilisant l’opérateur <<<.

Bash 3.0 prend en charge la correspondance d’expressions régulières en cours de processus en utilisant une syntaxe rappelant Perl.

En février 2009, Bash 4.0 a introduit le support des tableaux associatifs. Les indices de tableau associatif sont des chaînes, d’une manière similaire à AWK ou Tcl. Ils peuvent être utilisés pour émuler des tableaux multidimensionnels. Bash 4 change également sa licence en GPLv3; certains utilisateurs soupçonnent que ce changement de licence est la raison pour laquelle macOS continue d’utiliser des versions plus anciennes. Apple a finalement cessé d’utiliser Bash dans ses systèmes d’exploitation avec la sortie de macOS Catalina en 2019.

Extension d’accolade

L’extension d’accolade, également appelée alternance, est une fonctionnalité copiée à partir du shell C. Il génère un ensemble de combinaisons alternatives. Les résultats générés n’ont pas besoin d’exister sous forme de fichiers. Les résultats de chaque chaîne développée ne sont pas triés et l’ordre de gauche à droite est conservé:

$ echo a{p,c,d,b}eape ace ade abe$ echo {a,b,c}{d,e,f}ad ae af bd be bf cd ce cf

Les utilisateurs ne doivent pas utiliser d’extensions d’accolades dans les scripts shell portables, car le shell Bourne ne produit pas la même sortie.

$ # A traditional shell does not produce the same output$ /bin/sh -c 'echo a{p,c,d,b}e'a{p,c,d,b}e

Lorsque l’expansion des accolades est combinée avec des caractères génériques, les accolades sont d’abord développées, puis les caractères génériques résultants sont substitués normalement. Par conséquent, une liste d’images JPEG et PNG dans le répertoire courant pourrait être obtenue en utilisant:

ls *.{jpg,jpeg,png} # expands to *.jpg *.jpeg *.png - after which, # the wildcards are processedecho *.{png,jp{e,}g} # echo just show the expansions - # and braces in braces are possible.

En plus de l’alternance, l’expansion des accolades peut être utilisée pour des plages séquentielles entre deux entiers ou caractères séparés par des points doubles. Les versions plus récentes de Bash permettent à un troisième entier de spécifier l’incrément.

$ echo {1..10}1 2 3 4 5 6 7 8 9 10$ echo file{1..4}.txtfile1.txt file2.txt file3.txt file4.txt$ echo {a..e}a b c d e$ echo {1..10..3}1 4 7 10$ echo {a..j..3}a d g j

Lorsque l’expansion de l’accolade est combinée à une expansion variable, l’expansion variable est effectuée après l’expansion de l’accolade, ce qui peut dans certains cas nécessiter l’utilisation du eval intégré, ainsi:

$ start=1; end=10$ echo {$start..$end} # fails to expand due to the evaluation order{1..10}$ eval echo {$start..$end} # variable expansion occurs then resulting string is evaluated1 2 3 4 5 6 7 8 9 10

Startup scriptsEdit

Cette section contient des instructions, des conseils ou du contenu pratique. Le but de Wikipédia est de présenter des faits, pas de s’entraîner. Veuillez aider à améliorer cet article soit en réécrivant le contenu du guide pratique, soit en le déplaçant vers Wikiversity, Wikibooks ou Wikivoyage. (Janvier 2019)

Lorsque Bash démarre, il exécute les commandes dans une variété de fichiers dot. Contrairement aux scripts shell Bash, les fichiers dot n’ont généralement pas d’autorisation d’exécution activée ni de directive d’interpréteur comme #!/bin/bash.

Exemple de démarrage Bash compatible avec l’héritage

Le squelette ~/.bash_profile ci-dessous est compatible avec le shell Bourne et donne une sémantique similaire à csh pour les ~/.bashrc et ~/.bash_login. Le && cmd est une évaluation de court-circuit qui teste si le nom de fichier existe et est lisible, en sautant la pièce après le && si ce n’est pas le cas.

 && . ~/.profile # set up environment, once, Bourne-sh syntax onlyif ; then # are we interactive? && . ~/.bashrc # tty/prompt/function setup for interactive shells && . ~/.bash_login # any at-login tasks for login shell onlyfi # End of "if" block

Problèmes du système d’exploitation dans Bash startupEdit

Certaines versions d’Unix et Linux contiennent des scripts de démarrage du système Bash, généralement sous les répertoires /etc. Bash les appelle dans le cadre de son initialisation standard, mais d’autres fichiers de démarrage peuvent les lire dans un ordre différent de la séquence de démarrage Bash documentée. Le contenu par défaut des fichiers de l’utilisateur root peut également avoir des problèmes, ainsi que les fichiers squelette que le système fournit aux nouveaux comptes d’utilisateurs lors de la configuration. Les scripts de démarrage qui lancent le système X window peuvent également faire des choses surprenantes avec les scripts de démarrage Bash de l’utilisateur pour tenter de configurer des variables d’environnement utilisateur avant de lancer le gestionnaire de fenêtres. Ces problèmes peuvent souvent être résolus à l’aide d’un fichier ~/.xsession ou ~/.xprofile pour lire le fichier ~/.profile — qui fournit les variables d’environnement dont les fenêtres shell Bash ont besoin à partir du gestionnaire de fenêtres, telles que xterm ou le terminal Gnome.

PortabilityEdit

En invoquant Bash avec l’option --posix ou en indiquant set -o posixdans un script, Bash se conforme très étroitement à la norme POSIX 1003.2. Les scripts shell Bash destinés à la portabilité doivent prendre en compte au moins le standard shell POSIX. Certaines fonctionnalités bash non trouvées dans POSIX sont:

  • Certaines options d’appel étendues
  • Extension d’accolade
  • Tableaux et tableaux associatifs
  • Le double crochet ]construction de test étendue et sa correspondance regex
  • La construction d’évaluation arithmétique à doubles parenthèses (uniquement construction de test étendue et sa correspondance regex
  • La construction d’évaluation arithmétique à doubles parenthèses (seulement ((... )); $((... )) est POSIX)
  • Certaines opérations de manipulation de chaînes dans l’expansion des paramètres
  • local pour les variables à portée
  • Substitution de processus
  • builtins spécifiques à Bash
  • Coprocessus
  • variablesEPOCHSECONDS et variablesEPOCHREALTIME variables

Si un morceau de code utilise une telle fonctionnalité, on parle de « bashisme » – un problème pour une utilisation portable. Les checkbashisms et les shellcheck peuvent être utilisés pour s’assurer qu’un script ne contient pas ces parties. La liste varie en fonction du shell cible réel : la politique de Debian autorise certaines extensions dans leurs scripts (telles qu’elles sont dans dash), tandis qu’un script ayant l’intention de prendre en charge des shells Bourne pré-POSIX, comme configure d’autoconf, sont encore plus limités dans les fonctionnalités qu’ils peuvent utiliser.

Raccourcis clavier

Article principal: GNU Readline

Bash utilise readline pour fournir des raccourcis clavier pour l’édition en ligne de commande à l’aide des raccourcis clavier par défaut (Emacs). Les liaisons Vi peuvent être activées en exécutant set -o vi.

Process managementEdit

Le shell Bash dispose de deux modes d’exécution pour les commandes : le mode batch et le mode concurrent.

Pour exécuter des commandes par lots (c’est-à-dire en séquence), elles doivent être séparées par le caractère « ; », ou sur des lignes séparées :

command1; command2

dans cet exemple, lorsque command1 est terminé, command2 est exécuté.

Une exécution en arrière-plan de command1 peut se produire en utilisant (symbole &) à la fin d’une commande d’exécution, et le processus sera exécuté en arrière-plan, renvoyant immédiatement le contrôle au shell et permettant l’exécution continue des commandes.

command1 &

Ou pour avoir une exécution simultanée de deux command1 et command2, elles doivent être exécutées dans le shell Bash de la manière suivante:

command1 & command2

Dans ce cas, le symbole command1 est exécuté en arrière-plan &, renvoyant immédiatement le contrôle au shell qui exécute command2 au premier plan.

Un processus peut être arrêté et le contrôle renvoyé à bash en tapant Ctrl + z pendant que le processus est en cours d’exécution au premier plan.

Une liste de tous les processus, à la fois en arrière-plan et arrêtés, peut être obtenue en exécutant jobs:

$ jobs- Running command1 &+ Stopped command2

Dans la sortie, le nombre entre parenthèses fait référence à l’id de travail. Le signe plus signifie le processus par défaut pour bg et fg. Les textes « En cours d’exécution » et « Arrêté » font référence à l’état du processus. La dernière chaîne est la commande qui a démarré le processus.

L’état d’un processus peut être modifié à l’aide de différentes commandes. La commande fg place un processus au premier plan, tandis que bg définit un processus arrêté en cours d’exécution en arrière-plan. bg et fg peuvent prendre un id de travail comme premier argument, pour spécifier le processus sur lequel agir. Sans un, ils utilisent le processus par défaut, identifié par un signe plus dans la sortie de jobs. La commande kill peut être utilisée pour mettre fin prématurément à un processus, en lui envoyant un signal. L’id de la tâche doit être spécifié après un signe de pourcentage :

kill %1

Exécution conditionnelledit

Bash fournit des séparateurs de commandes « exécution conditionnelle » qui rendent l’exécution d’une commande conditionnelle au code de sortie défini par une commande précédente. Par exemple :

cd "$SOMEWHERE" && ./do_something || echo "An error occurred" >&2

Où./do_something n’est exécuté que si la commande cd (change directory) a « réussi » (renvoie un état de sortie de zéro) et la commande echo ne sera exécutée que si le cd ou le.la commande /do_something renvoie une « erreur » (état de sortie différent de zéro).

Pour toutes les commandes, l’état de sortie est stocké dans la variable spéciale $?. Bash prend également en charge if...;puis ...;autre ...; fi et caseVARIABLEVARIABLE danspatternpattern)...;;otherother_pattern)...;; esac formes d’évaluation de commande conditionnelle.

Rapport de bogue

« bashbug » redirige ici. Pour le bogue de septembre 2014 largement rapporté trouvé dans Bash, voir Shellshock (bug logiciel).

Une commande externe appelée bashbug signale les bogues du shell Bash. Lorsque la commande est appelée, elle affiche l’éditeur par défaut de l’utilisateur avec un formulaire à remplir. Le formulaire est envoyé aux responsables de Bash (ou éventuellement à d’autres adresses e-mail).

completionEdit programmable

Complétion programmable Bash, les commandes complete et compgen sont disponibles depuis la version bêta de 2.04 en 2000. Ces fonctionnalités permettent une complétion intelligente complexe, par exemple en proposant de compléter les options de programme disponibles, puis, une fois que l’utilisateur a sélectionné une option nécessitant un nom de fichier comme entrée suivante, uniquement des chemins de fichiers à remplissage automatique (et non d’autres options) pour le jeton suivant.