# Bourne shell

Le Bourne shell ou bsh (ou encore simplement sh dans de nombreuses versions d'UNIX) est un shell Unix. C'est le shell par défaut de la version 7 d'Unix ; dans les versions antérieures d'UNIX, le nom sh désigne le Thompson shell, et dans certaines versions actuelles, il désigne le Korn shell.
Le Bourne shell a été programmé par Stephen Bourne (d'où le nom) d'AT&T Bell Laboratories et a fait son apparition pour la première fois en 1977 sur la version 7 d'Unix qui était distribuée aux universités et académies. Il est resté depuis cette époque le shell par défaut pour les comptes Unix. Le fichier exécutable du Bourne shell ou de tout autre shell compatible se trouve à l'emplacement /bin/sh sur la plupart des systèmes Unix et est toujours le shell par défaut du compte root sur de nombreuses implémentations d'Unix.
Avec son système de tubes connectant la sortie d'une commande à l'entrée d'une autre, il permet d'écrire des scripts complexes à partir de commandes simples. Une version améliorée de ce shell est le Bourne-Again shell.

## Principes généraux

Les buts poursuivis dans la conception du Bourne shell étaient :
* de pouvoir utiliser des shell scripts comme filtres,
* des possibilités de programmation, y compris avec structures de contrôle et variables,
* d'avoir le contrôle sur tous les descripteurs de fichiers en lecture/écriture,
* d'avoir le contrôle sur signaux dans l'exécution des scripts,
* de s'affranchir des limites sur la longueur des chaînes dans l'interprétation des shell scripts,
* de rationaliser et généraliser les mécanismes d'adressage des chaînes de caractère (string quoting),
* de disposer d'un mécanisme d’environnement, afin de récupérer le contexte au démarrage du script, et de pouvoir le transmettre aux process-fils sans avoir à recourir à des chemins explicites.

## Caractéristiques de la version originale

* Il est possible de lancer un script en tapant en ligne de commande le nom de fichier contenant le script
* Le shell peut être utilisé en arrière-plan
* Les commandes peuvent fonctionner en mode synchrone comme asynchrone
* Prise en charge des redirections d'entrée/sortie et du tube, ou pipe
* mise à disposition d'un jeu de commandes natives au shell
* existence de structures de contrôle, de l'adressage indirect, et de la notion de fonction.
* variables non-typées
* variables à portée globale
* bannissement de l’instruction de branchement inconditionnel goto, afin d’imposer une programmation structurée
* mécanisme de substitution de commande avec syntaxe en back quotes : `command`.
* redirection d'entrée de type document « ici-même » avec la syntaxe << pour substituer des arguments d'entrée dans un script.
* boucles for ~ do ~ done, avec en particulier le métacaractère $* pour balayer les arguments.
* structure de contrôle case ~ in ~ esac, pour faciliter le tri des arguments d'une commande.
* Des possibilités d'extension pour le contrôle et les tests de comparaisons sur les flux d'entrée/sortie.
Le Bourne shell a été le premier à mettre en œuvre la convention de descripteur de fichier 2> pour adresser le flux du message d'erreur, dotant ainsi les scripts d'un mécanisme de gestion dynamique des exceptions.
Stephen Bourne a importé certains aspects du compilateur Algol 68C (sur lequel il avait travaillé à l'Université de Cambridge) dans son shell. Ce sont notamment des réemplois de portions du compilateur Algol 68 : "if ~ then ~ elif ~ else ~ fi", "case ~ in ~ esac" et les clauses "for ~ while ~ do ~ od" (avec done au lieu de od) pour la syntaxe commune du Bourne shell Unix. En outre (et bien que la version 7 du shell soit écrite en langage C), Bourne a utilisé quelques macros pour donner à son code source un rendu « Algol 68 ». Ces macros (avec la commande finger apparue avec la version BSD 4.2 d'Unix) ont inspiré l’IOCCC – International Obfuscated C Code Contest.