Quel est le point de sh lié à dash?

36

Je me demande à quoi sert d' shêtre symbolique dash? Je comprends que cela dashest supposé être plus rapide que bash, mais je ne sais pas pourquoi le shshell original n’est pas présent dans sh.

Ou si quelque chose pourquoi n'est pas shlié à bash?

NerdOfCode
la source

Réponses:

72

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 gotoqui 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/shpar 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 shfonctionnalité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/shdevait ê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/shdans 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/shscripts) 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/shest 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.

Gilles, arrête de faire le mal
la source
Je dirais qu'il y a de bonnes raisons d'utiliser ksh93 en tant que / bin / sh - c'est l'un des shells POSIX les plus performants disponibles. Convenu que l'omniprésence de Dash est une question de timing.
Charles Duffy
2
@CharlesDuffy Ksh93 est plus rapide à faire des choses complexes, mais dash le bat pour le démarrage, et pour les scripts simples (tels que tous les appels à system(3) que font les applications), c'est le facteur dominant.
Gilles, arrête de faire le mal
21

La rapidité et la conformité à POSIX (en d’autres termes, la portabilité) sont les principaux facteurs. N'oubliez pas que cela /bin/shconcerne 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 bashsont 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:

Pourquoi ce changement a-t-il été effectué? La principale raison de changer de shell par défaut était l'efficacité. bash est un excellent shell complet convenant à une utilisation interactive; En effet, c'est toujours le shell de connexion par défaut. Cependant, son démarrage et son fonctionnement sont relativement importants et lents par rapport à dash. Un grand nombre d'instances de shell sont démarrées dans le cadre du processus de démarrage d'Ubuntu. Plutôt que de modifier chacun individuellement pour qu'il s'exécute explicitement sous / bin / dash, un changement qui nécessiterait une maintenance continue importante et qui risquerait de régresser s'il n'était pas suivi de près, l'équipe de développement Ubuntu a estimé qu'il était préférable de changer simplement le shell par défaut. Les améliorations de la vitesse de démarrage dans Ubuntu 6.10 ont souvent été attribuées à tort à Upstart, une excellente plateforme pour le développement futur du système init, mais à Ubuntu 6. 10 fonctionnait principalement en mode de compatibilité Système V avec seulement de petits changements de comportement. Ces améliorations étaient en fait en grande partie dues au changement de / bin / sh.

Et voici une note sur la portabilité:

Le manuel de stratégie Debian a longtemps stipulé que "les scripts de shell spécifiant" / bin / sh "comme interpréteur doivent uniquement utiliser les fonctionnalités POSIX"; en fait, cette exigence est en place depuis bien avant le lancement du projet Ubuntu. En outre, tous les scripts de shell censés être portables sur d'autres systèmes Unix, tels que les BSD ou Solaris, respectaient déjà cette exigence. Ainsi, nous avons estimé que l’impact de ce changement sur la compatibilité serait minime.

Voir https://wiki.ubuntu.com/DashAsBinSh

Sergiy Kolodyazhnyy
la source
Ne prend pas en dashcharge les fonctionnalités non requises par POSIX?
NerdOfLinux
@NerdOfLinux Peu importe ce que / bin / sh prend en charge en plus de POSIX (tant que ces ajouts ne cassent pas les scripts POSIX); L'important est qu'il supporte tout (et le plus rapidement possible). Tant que dash remplit ces conditions, / bin / sh peut y être lié.
Guntram Blohm soutient Monica
9

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/shde 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/shcelui 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.

thomasrutter
la source
"Dash est très rapide, mais est aussi très étroitement compatible POSIX - un standard qui est étroitement aligné sur le shell Bourne." Oui, bien que POSIX soit plus étroitement apparenté ksh, je dirais. Je ne me souviens pas que Bourne shell ait eu une expansion arithmétique `$ (())`, qui est POSIX.
Sergiy Kolodyazhnyy
1
En outre, dans Bourne, ^est un caractère de pipe - donc echo foo ^ catémettra foo ^ catdans POSIX sh, mais foodans Bourne; Ce test spécifique montre comment Autoconf distingue les deux.
Charles Duffy
Intéressant, alors par POSIX sh tu veux dire Korn?
thomasrutter
0

/bin/shest lié à /bin/dashce que je crois être des raisons de compatibilité. Beaucoup de scripts commencent simplement par

#!/bin/sh

donc en se déplaçant vers dashet en ne faisant pas de lien symbolique, beaucoup de scripts ne fonctionneraient pas correctement (ou pas du tout) s'ils /bin/shn'existaient pas du tout.

La modification a été effectuée de bashà dashparce que, selon https://wiki.ubuntu.com/DashAsBinSh :

La principale raison de changer de shell par défaut était l'efficacité. bash est un excellent shell complet convenant à une utilisation interactive; En effet, c'est toujours le shell de connexion par défaut. Cependant, son démarrage et son fonctionnement sont plutôt volumineux et lents par rapport à dash. Un grand nombre d'instances de shell sont démarrées dans le cadre du processus de démarrage d'Ubuntu. Plutôt que de modifier chaque élément individuellement pour qu'il s'exécute explicitement sous / bin / dash, un changement qui nécessiterait une maintenance continue importante et qui risquerait de régresser s'il ne faisait pas l'objet d'une attention particulière, l'équipe de développement principale d'Ubuntu a estimé qu'il était préférable de changer simplement. le shell par défaut.

shn'est pas lié à bash, car

Le manuel de stratégie Debian a longtemps stipulé que "les scripts de shell spécifiant" / bin / sh "comme interpréteur doivent uniquement utiliser les fonctionnalités POSIX"

Si vous voulez utiliser bashcomme /bin/sh:

Si les problèmes sont plus répandus et que vous souhaitez rétablir le shell système par défaut, vous pouvez indiquer au système de gestion des paquets d'arrêter l'installation de dash en tant que / bin / sh:

sudo dpkg-reconfigure dash

Certaines fonctionnalités dashfournissent ce que bash ne propose pas, comme:

il y a même une chance extérieure que quelques scripts dépendent maintenant d'une fonctionnalité de dash que bash ne fournit pas!

NerdOfLinux
la source
J'ai déjà compris que la compatibilité était peut-être un facteur, mais je recherchais une réponse moins évidente et plus détaillée ...
NerdOfCode
2
Donc , si je devais installer la bourne shell d' origine shà /bin/sh, serait cette vis jusqu'à ces scripts de démarrage?
dessert
Il serait probablement préférable d’essayer cela sur une machine virtuelle avant de le déployer dans le monde réel ...
NerdOfCode
2
Vous devriez laisser /bin/shle 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é.
thomasrutter
1
@mckenzm Le shell auquel les /bin/shliens sont associés est distinct de celui qu'un utilisateur particulier a défini comme shell de connexion initial. L'objectif de /bin/shne dépend pas de quel utilisateur est à la recherche, et vous faire besoin d'utiliser sudo--ou d'autres moyens d'agir en tant qu'utilisateur root - pour le modifier. Aussi, en général et pour tout paquet, dpkg-reconfiguredoit ê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 la chshcommande. Le nom de son shell de connexion initial est également entré $SHELLet est également utilisé pour certains shells interactifs.
Eliah Kagan