La réponse courte à “pourquoi la coquille d'origine n'est pas présente dans sh
” est qu'il n'y a pas de sh d'origine.
Bon, d'accord, il y a: c'est la coquille Thompson . La version 1 présentait certaines des fonctionnalités que nous connaissons aujourd'hui, notamment la redirection et les pipes (lisez l'article de Dennis Ritchie sur la première histoire Unix ). Les versions ultérieures ont ajouté des fonctionnalités telles que l'exécution en arrière-plan avec &
, globbing (implémenté avec un programme externe) et certaines formes de citation, mais il n'y avait pas de variables ou de structures de contrôle imbriquées. Les conditions et les boucles étaient fournies via des programmes externes if
(qui utilisaient une condition et une commande comme arguments) et goto
qui fonctionnaient en modifiant la position du fichier parent dans le fichier script.
En 1979, dans Unix V7 , le shell Thompson a été remplacé comme /bin/sh
par le shell Bourne . La première version présentait déjà de nombreuses fonctionnalités présentes dans Dash aujourd'hui, et les versions suivantes en ont introduit beaucoup plus . Quelques années plus tard, le shell Korn est entré en scène, avec un ensemble de fonctionnalités en croissance; de nombreuses variantes d'Unix l'ont installé sous le nom ksh
.
En 1992, POSIX a codifié un ensemble minimal de sh
fonctionnalités, essentiellement Bourne, et quelques autres éléments. Tout système appelé «Unix» devait au moins implémenter ces fonctionnalités. Les systèmes commerciaux Unix utilisaient habituellement ksh comme POSIX sh, mais quelques-uns (par exemple OSF / 1 ) avaient les leurs.
Ni le shell Bourne ni le shell Korn n’étaient des sources ouvertes jusqu’à récemment, de sorte que lorsque le monde Linux a commencé à se former au milieu des années 90, ils n’étaient plus disponibles. /bin/sh
devait être quelque chose d'autre. La plupart des distributions Linux utilisaient bash , un shell du projet GNU qui avait tendance à être entre Bourne et Korn en termes de fonctionnalités de script, bien mieux qu’en utilisation interactive. La seule alternative viable était pdksh ("domaine public Korn"), un programme libre (maintenant abandonné, mais vivant comme mksh , qui est activement développé ), mais je ne me souviens pas d’une distribution Linux utilisant pdksh./bin/sh
, Je ne sais pas pourquoi, parce que les distributions Linux étaient toujours des distributions GNU / Linux, livrant essentiellement les versions GNU de tout outil pour lequel une version GNU existait déjà.
Il y avait aussi plusieurs implémentations open source de sh
"ash", notamment le shell Almquist , mais elles étaient très incomplètes, manquant de certaines fonctionnalités POSIX que les gens voulaient utiliser. Herbert Xu , un programmeur qui était responsable de Debian , a étendu les cendres pour les rendre compatibles avec POSIX. Finalement, sa version a été renommée en dash, et des efforts ont été déployés pour le rendre /bin/sh
dans Debian au lieu de bash. Ubuntu a commencé avant que Debian ne commence à traiter systématiquement les basismes (utilisation de fonctionnalités spécifiques à bash dans les #!/bin/sh
scripts) comme des bogues . Les deux ont changé plus tard ( Ubuntu 6.10 , Debian seulement en 2009 ( c’était un objectif pour Lenny). mais le changement n’a été effectué qu’après la publication de Lenny, c’est-à-dire en compression)).
Une importante raison d'utiliser comme tableau de bord plutôt que bash comme /bin/sh
est qu'il est beaucoup plus rapide. C'était particulièrement important pour Ubuntu, qui s'efforce depuis le début de garder les temps de démarrage courts. Dash a également tendance à utiliser moins de mémoire que bash, ce qui est assez important pour les scripts wrapper qui restent dans les parages pour effectuer un nettoyage lorsque le programme sous-jacent se termine. Un autre avantage du tableau de bord est qu'il ne s'appuie que sur libc (la bibliothèque système principale), tandis que bash s'appuie également sur les bibliothèques de support terminal (il ne peut pas démarrer sans elles, même pour exécuter un script); cela signifie que dash a une meilleure chance de continuer à travailler sur un système en panne.
Au cours du 21ème siècle, le shell Korn est devenu open source et des versions open source du shell Bourne sont apparues (anciennes versions, car le développement avait cessé depuis des années). Mais dash et bash étaient trop fermement ancrés dans le monde Linux pour qu’ils puissent être acceptés, en particulier le shell Bourne, car sa valeur n’est aujourd’hui que historique. Dash déplacé bash parce qu'il avait des avantages évidents, mais aucun des autres prétendants n'a aucun avantage décisif comme /bin/sh
.
system
(3) que font les applications), c'est le facteur dominant.La rapidité et la conformité à POSIX (en d’autres termes, la portabilité) sont les principaux facteurs. N'oubliez pas que cela
/bin/sh
concerne les scripts système, qui peuvent provenir ou non d'anciennes versions d'Ubuntu et / ou d'autres systèmes.Certes, les fonctionnalités brillantes de
bash
sont cool à utiliser pour nous, utilisateurs, mais quand il s'agit de fonctionner dans un environnement où vous devez gérer plusieurs serveurs / systèmes différents - avoir un shell compatible POSIX fait toute la différence. Surtout si vous êtes un nouvel environnement sysadmin et hérité avec de nombreux scripts.Pourquoi le shell Bourne original n’est-il pas présent? C’est simple: c’est un produit propriétaire qui appartenait à l’origine à AT & T Bell Labs.
En outre, il existe une explication explicite sur le wiki Ubuntu à ce sujet:
Et voici une note sur la portabilité:
Voir https://wiki.ubuntu.com/DashAsBinSh
la source
dash
charge les fonctionnalités non requises parPOSIX
?Dans les distributions GNU / Linux, "l'original
/bin/sh
" est en réalité Bash.GNU recherchait un shell de type Bourne sous licence GPL, c’est pourquoi ils ont choisi Bash
/bin/sh
, plutôt que Bourne, qui n’était pas sous licence GPL. Les distributions Linux modernes ont hérité de cette décision au point de devenir un standard de facto pour/bin/sh
être Bash. Le shell Bourne original ("sh") a été utilisé dans d’autres Unix non Linux, même récemment que Solaris 10, mais il n’a jamais été un pilier des distributions Linux.Passer
/bin/sh
de bash à dash était une décision de Debian (héritée d’Ubuntu) principalement motivée par la rapidité - c’est venu à un moment où ils ont consenti un effort considérable pour améliorer la vitesse de démarrage et une grande partie du temps de calcul du processeur au moment de l’exécution cohérente. scripts d'init.Bash continue d'être utilisé comme shell d'interaction / de connexion par défaut pour les utilisateurs, mais Dash est
/bin/sh
celui qui est exécuté et celui qui est exécuté pour les scripts système tels que les scripts init.Dash est très rapide, mais est également très étroitement compatible POSIX - un standard qui est étroitement aligné sur le shell Bourne. D'une certaine manière, en passant de Bash à Dash, nous revenons à un shell plus proche de Bourne.
la source
ksh
, je dirais. Je ne me souviens pas que Bourne shell ait eu une expansion arithmétique `$ (())`, qui est POSIX.^
est un caractère de pipe - doncecho foo ^ cat
émettrafoo ^ cat
dans POSIX sh, maisfoo
dans Bourne; Ce test spécifique montre comment Autoconf distingue les deux./bin/sh
est lié à/bin/dash
ce que je crois être des raisons de compatibilité. Beaucoup de scripts commencent simplement pardonc en se déplaçant vers
dash
et en ne faisant pas de lien symbolique, beaucoup de scripts ne fonctionneraient pas correctement (ou pas du tout) s'ils/bin/sh
n'existaient pas du tout.La modification a été effectuée de
bash
àdash
parce que, selon https://wiki.ubuntu.com/DashAsBinSh :sh
n'est pas lié àbash
, carSi vous voulez utiliser
bash
comme/bin/sh
:Certaines fonctionnalités
dash
fournissent ce que bash ne propose pas, comme:la source
sh
à/bin/sh
, serait cette vis jusqu'à ces scripts de démarrage?/bin/sh
le shell fourni par la distribution, car c'est ce qu'ils ont ciblé avec leurs scripts de démarrage, etc. Mais si vous le remplaciez par Bourne, ce serait pour la plupart compatible. J'imagine qu'il y aurait des ruptures cependant, uniquement en raison de différences minimes par rapport à la quantité de code. Bien sûr, vous êtes libre d'utiliser le shell dans vos propres scripts avec un hashbang personnalisé./bin/sh
liens sont associés est distinct de celui qu'un utilisateur particulier a défini comme shell de connexion initial. L'objectif de/bin/sh
ne dépend pas de quel utilisateur est à la recherche, et vous faire besoin d'utilisersudo
--ou d'autres moyens d'agir en tant qu'utilisateur root - pour le modifier. Aussi, en général et pour tout paquet,dpkg-reconfigure
doit être exécuté en tant que root. En revanche, les utilisateurs sont généralement autorisés à modifier leur propre shell de connexion initial et peuvent le faire avec lachsh
commande. Le nom de son shell de connexion initial est également entré$SHELL
et est également utilisé pour certains shells interactifs.