URL: https://linuxfr.org/news/petite-histoire-du-bourne-shell Title: Petite histoire du Bourne Shell Authors: Sygne Benoît Sibaud, palm123 et bubar🦥 Date: 2015年03月20日T13:45:01+01:00 License: CC By-SA Tags: histoire, bourne_shell, shell, ken_thompson, steve_bourne, bill_joy et brian_kernighan Score: 90 Nos systèmes d'exploitations sont forgés par l'histoire. Ils se sont formés par stratifications d'inventions accumulées. Les idées de Ken Thompson, Steve Bourne, et Bill Joy - pour ne citer que les personnes dont il est question dans cette dépêche - sont fossilisées dans les sources des logiciels que nous utilisons aujourd'hui. Parce qu'un rappel historique nous permet de comprendre les raisons du fonctionnement actuel d'un logiciel, cette dépêche présente rapidement l'histoire du shell de Bourne. ---- [Interview de Steve Bourne](http://www.computerworld.com.au/article/279011/a-z_programming_languages_bourne_shell_sh/) [Histoire du Bourne Shell](http://www.in-ulm.de/~mascheck/bourne/index.html#origins) [Heirloom Bourne Shell](http://heirloom.sourceforge.net/sh.html) ---- # Thompson Shell # ## Simple interpréteur ## Le shell orignal d'UNIX a été créé par [Ken Thompson](http://www.in-ulm.de/~mascheck/bourne/korn.html). D'abord pensé comme simple interpréteur de commande, il n'avait aucune fonction de programmation : ni contrôle de flux (tels `if` et `while`), ni variables, ni fonctions. ## Tubes ## Il permettait néanmoins d'enchaîner les commandes par l'utilisation des tuyaux. La notion de filtre et sa symbolisation ont en effet été mises au point en 1972. Le Thompson Shell utilisait le [même symbole](http://minnie.tuhs.org/pipermail/tuhs/2003-January/000331.html) (`>`) pour enchaîner les commandes que pour déporter la sortie vers un fichier : ``` bash com1> com2> com3> outfile ``` Cette syntaxe était peu pratique, car il fallait mettre entre guillemets les commandes contenant des arguments, et parce que le shell ne pouvait distinguer entre un programme et un fichier. Enfin, pour écrire sur la sortie standard, il fallait le spécifier explicitement : ``` bash com1> com2> com3> ``` C'est en 1973, pour la quatrième édition d'UNIX, que la [syntaxe des tubes est repensée](http://minnie.tuhs.org/pipermail/tuhs/2003-January/000335.html), et c'est le symbole `^` qui est utilisé pour les représenter. ## Scripts ## Le Thompson Shell permettait d'exécuter les commandes inscrites dans un fichier, et donc de créer des scripts rudimentaires. Les premières commandes de contrôle de flux utilisables par le Thompson shell étaient en fait des commandes extérieures au shell : `/bin/if` et `/bin/goto`. C'est au milieu des années 70 que quelques commandes sont ajoutées au Thompson Shell pour en faire un langage de programmation. La possibilité d'utiliser des variables est aussi ajoutée, de sorte que le Thompson Shell devient véritablement programmable. Cette nouvelle version du Thompson Shell est [parfois nommée](http://www.in-ulm.de/~mascheck/bourne/n.u-w.mashey.html) PWB (_Programmer's WorkBench_) shell, ou _Mashey Shell_. On peut trouver quelques exemples de [scripts](http://v6shell.org/v6scripts/) pour une version tardive du Thompson Shell. # Bourne Shell # [Steve Bourne](http://fr.wikipedia.org/wiki/Stephen_Bourne) a commencé à travailler sur son shell vers 1975 ou 1976, mais ce n'est qu'en 1979 qu'il est officiellement introduit dans la septième édition d'UNIX. Les premières versions du Bourne Shell sont écrites dans une variante du C ressemblant à l'[Algol](http://fr.wikipedia.org/wiki/Algol_%28langage%29) ([_Algol like variant of C_](http://www.in-ulm.de/~mascheck/bourne/korn.html)). En 1982, le bourne shell est ré-écrit en _C Kernighan et Ritchie_ (le C dans le style de leur [livre de 1978](http://fr.wikipedia.org/wiki/The_C_Programming_Language)). ## Chaînes de caractères et variables ## Dans une [longue interview de ComputerWorld](http://www.computerworld.com.au/article/279011/a-z_programming_languages_bourne_shell_sh/), Bourne explique que pour simplifier la vie des usagers d'UNIX il fallait commencer par simplifier l'usage des chaînes de caractères. Avant le Bourne Shell, les variables sont des noms, et les chaînes de caractères sont repérées par leurs guillemets. Bourne propose l'inverse : il suffit de taper une chaîne de caractères pour qu'elle soit reconnue comme telle, et tout ce qui n'est pas une chaîne de caractères doit être identifié. Ainsi, l'usage du `$` a été proposé pour reconnaître les variables. La possibilité d'exporter les variables dans l'environnement - et donc de créer des variables d'environnement - a été introduite sur les systèmes UNIX avec la septième version du Bourne Shell. Enfin, ce n'est qu'à partir de 1981 que le caractère `#` peut être utilisé pour les commentaires. ## Filtres ## Si les shells en usage avant celui de Bourne permettaient d'utiliser les filtres, ils ne permettaient pas de créer des scripts qui fonctionnent eux-mêmes comme filtres, car l'entrée standard était le script lui-même. Cette limitation est levée par le Bourne Shell. Dans le même esprit il introduit la substitution de commande : `'commande'` permet d'utiliser le résultat de `commande` comme argument d'un script. C'est aussi avec le Bourne Shell que sont introduites les redirections `>&`, `<&`, `<&-` et `>&`. Il introduit enfin une syntaxe pour indiquer qu'un document suit (_here document_) : ``` bash <<-eof Ceci est un document EOF ``` Cette ergonomie du Bourne Shell a été conservée par ses épigones jusqu'à aujourd'hui. [Héritier du Thompson Shell](http://www.in-ulm.de/~mascheck/bourne/index.html#origins), le traditionnel Bourne Shell se reconnaît néanmoins facilement au fait que le symbole `^` peut être utilisé comme remplacement du symbole `|` pour créer des tuyaux. ## Performances ## À la fin des années 70, tant le Bourne Shell que le Thompson Shell étaient présents et utilisés sur UNIX. Le Thompson Shell avait alors incorporé les idées de Bourne. Comme ils n'étaient pas compatibles entre-eux, la question s'est posée de savoir lequel des deux devait être le shell standard d'UNIX. C'est finalement le Bourne Shell qui a été choisi. Si le Bourne Shell facilitait la création de scripts, cet avantage n'était que mineur suite aux évolutions du Thompson Shell. C'est plutôt les performances du shell de Bourne qui ont convaincu les utilisateurs d'UNIX. De fait, sur l'année de travail qu'a représenté l'écriture du Bourne Shell, six mois ont été consacrés à l'amélioration de ses performances. ## L'édition de commandes ## Le Bourne Shell, ne proposait pas d'historique, ni n'offrait la possibilité d'éditer une commande commencée. Ces fonctionnalités ont été introduites avec le C shell de Bill Joy, qui travaillait alors à l'université de Berkeley. La possibilité d'éditer une commande en mode vi ou emacs a ensuite été portée sur le Bourne Shell. ## Évolutions ## Bourne cesse d'améliorer son Shell en 1983 après y avoir introduit les `fonctions`. Dans [l'interview de ComputerWorld](http://www.computerworld.com.au/article/279011/a-z_programming_languages_bourne_shell_sh/?pp=3), il explique que :> « Aucun langage ne peut résoudre tous les problèmes du monde de la programmation, ainsi, soit il en reste au point où vous le conservez simple et raisonnablement élégant, soit vous continuez sans cesse à ajouter des trucs. [...] J'ai donc décidé que le shell avait atteint ses limites à l'intérieur des contraintes structurelles qui sont les siennes. »> « Any one language cannot solve all the problems in the programming world and so it gets to the point where you either keep it simple and reasonably elegant, or you keep adding stuff. [....] So I decided that the shell had reached its limits within the design constraints that it originally had. » Le Bourne shell a donc peu évolué depuis, il a néanmoins été adapté aux normes POSIX. Comme ce shell a inspiré ceux d'aujourd'hui, il est possible qu'il puisse toujours exécuter certains scripts créés pour d'autres shell. # Heirloom Bourne Shell # Pour le [Projet Heirloom](http://heirloom.sourceforge.net/sh.html), Gunnar Ritter a converti le code source du bourne shell à la norme ANSI du C. Cette version ne supporte pas la norme POSIX-2, car cela allait à l'encontre de certaines caractéristiques originales du shell. Cultivant une certaine nostalgie, Gunnar Ritter trouve des raisons d'utiliser le shell de Bourne :> « Bien sur, il lui manque quelques caractéristiques plaisantes telles que l'historique des commandes, la complétion de la ligne de commande, etc. Mais travailler avec ces particularités tend à distraire l'attention de l'utilisateur. Après une phase de familiarisation, l'utilisation du Bourne Shell peut conduire à un style de travail plus tempéré et concentré. Essayez-le. Sérieusement. »> « Of course, it lacks fancy features such as a command history, command line completion, etc. But working with these features tends to distract the user's attention. After a familiarization phase, use of the Bourne shell can lead to a more even-tempered, concentrated working style. Give it a try. Seriously. »