web-dev-qa-db-fra.com

Quel est le point de lier sh à Dash?

Je me demande quel est le point de shétant symbolique lié à dashest? Je comprends que dashest censé être plus rapide que bashname__, mais je ne sais pas pourquoi le shell shd'origine n'est pas présent dans shname__.

Sinon, pourquoi shn'est-il pas lié à bashname__?

28
NerdOfCode

La réponse courte à la question de savoir pourquoi le sh original n'est pas présent dans sh est qu'il n'y a pas de sh original.

Bon, ok, il y en a: c'est le Thompson Shell . La version 1 présentait certaines des fonctionnalités que nous connaissons aujourd'hui, en particulier la redirection et les pipes (lire L'article de Dennis Ritchie sur l'historique Unix antérieur ). 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 guillemets, mais sans variables ni structures de contrôle imbriquées. Les conditions et les boucles étaient fournies via des programmes externes if (qui prenait une condition et une commande comme arguments) et goto (qui fonctionnait en modifiant la position du fichier parent dans le fichier de script).

En 1979, dans Unix V7 , le shell Thompson a été remplacé par /bin/sh par le Bourne Shell . La première version contenait déjà de nombreuses fonctionnalités présentes dans le tableau de bord aujourd'hui, et les versions suivantes introduisent de nombreux autres . Quelques années plus tard, le Korn Shell est entré en scène, avec un ensemble de fonctionnalités croissant; de nombreuses variantes d'Unix l'ont installé sous le nom ksh.

En 1992, POSIX a codifié un ensemble minimal de fonctionnalités sh qui était essentiellement Bourne plus quelques éléments. Tout système appelé "Unix" devait au moins implémenter ces fonctionnalités. Les systèmes commerciaux Unix utilisaient généralement ksh comme POSIX sh, mais quelques-uns (par exemple, OSF/1 ) avaient le leur.

Le Bourne Shell et le Korn Shell n'étaient pas encore open source jusqu'à récemment. Par conséquent, lorsque le monde Linux a commencé à se former au milieu des années 90, ils n'étaient pas disponibles. /bin/sh devait être autre chose. La plupart des distributions Linux ont opté pour bash , un shell du projet GNU qui tendait à se situer entre Bourne et Korn en termes de fonctionnalités de script, bien mieux pour une utilisation interactive). La seule alternative viable était pdksh ("domaine public Korn Shell"), un logiciel libre (maintenant abandonné, mais vivant comme mksh , qui est activement développé ) , mais je ne me souviens pas d’une distribution Linux utilisant pdksh comme /bin/sh, je ne sais pas pourquoi, je suppose, car les distributions Linux étaient toujours des distributions GNU/Linux, livrant essentiellement GNU versions de tout outil pour lequel La version GNU existe.

Il y avait aussi plusieurs implémentations open source de sh appelées "ash", notamment le Almquist Shell , mais elles étaient très incomplètes, manquant de certaines fonctionnalités POSIX que les gens voulaient utiliser. Un programmeur qui était responsable de Debian, Herbert Xu , a étendu les cendres pour le rendre compatible POSIX. Finalement, sa version a été renommée en dash, et il y a eu un certain Push pour le rendre /bin/sh dans Debian au lieu de bash. Ubuntu a commencé avant que Debian ne commence à traiter systématiquement les basismes (l'utilisation de fonctionnalités spécifiques à bash dans les scripts #!/bin/sh) comme bugs . 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é fait qu'après la publication de Lenny, c'est-à-dire écraser)).

Une raison majeure pour d'utiliser dash en tant que plutôt que bash en tant que /bin/sh est qu'il est nettement 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 de dash 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, Korn Shell est devenu open source et des versions open source de Bourne Shell 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 Bourne Shell, 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 d'avantage décisif en tant que /bin/sh.

63
Gilles

La rapidité et la conformité à POSIX (en d’autres termes, la portabilité) sont les principaux facteurs. N'oubliez pas que /bin/sh est destiné aux 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 agréables à utiliser pour nous, mais lorsqu'il s'agit de fonctionner dans un environnement où vous devez gérer plusieurs serveurs/systèmes différents, le fait que Shell soit conforme à POSIX fait toute la différence. Surtout si vous êtes un nouvel environnement sysadmin et hérité avec de nombreux scripts.

Quant à la raison pour laquelle Bourne Shell d’origine n’est pas présent, c’est simple: c’est un produit propriétaire à l’origine appartenant à AT & T Bell Labs.

En outre, il existe en fait 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, adapté à une utilisation interactive; En effet, il s’agit toujours du 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 Shell sont démarrées dans le cadre du processus de démarrage 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. Les améliorations de la vitesse de démarrage dans Ubuntu 6.10 ont souvent été attribuées à tort à Upstart, une plate-forme idéale pour le développement futur du système init, mais fonctionnait principalement en mode de compatibilité Système V avec Ubuntu 6.10, 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ète 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 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

21

Dans les distributions GNU/Linux, le "/bin/sh" original est en réalité Bash.

GNU recherchait un shell de type Bourne sous licence GPL. C’est la raison pour laquelle ils ont choisi Bash pour leur /bin/sh, au lieu de Bourne, qui n’était pas sous licence GPL. Les distributions Linux modernes ont hérité de cette décision au point qu'il est devenu un standard de facto pour /bin/sh d'être Bash. Le Bourne Shell d'origine ("sh") a été utilisé dans d'autres Unix non Linux, même jusqu'à une date récente comme Solaris 10, mais il n'a jamais été un pilier des distributions Linux.

Basculer /bin/sh de bash à dash était une décision de Debian (héritée d’Ubuntu) principalement motivée par la vitesse - c’est arrivé à un moment où ils ont consenti des efforts considérables pour améliorer la vitesse de démarrage et une grande partie du temps de exécuter des scripts init.

Bash continue d'être utilisé comme shell de connexion/connexion interactif par défaut pour les utilisateurs, mais Dash est celui qui est situé à /bin/sh 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 proche de la compatibilité POSIX - un standard étroitement aligné sur Bourne Shell. D'une certaine manière, en passant de Bash à Dash, nous revenons à un Shell plus proche de Bourne.

9
thomasrutter

/bin/sh est lié à /bin/dash pour ce que je crois être des raisons de compatibilité. Beaucoup de scripts commencent simplement par

#!/bin/sh

donc en passant à dash et en ne faisant pas de lien symbolique, beaucoup de scripts ne fonctionneraient pas correctement (ou pas du tout) si /bin/sh n'existait pas du tout.

La modification a été effectuée de bash à dash car 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, adapté à une utilisation interactive; En effet, il s’agit toujours du 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 Shell sont démarrées dans le cadre du processus de démarrage 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.

sh n'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 souhaitez utiliser bash en tant que /bin/sh:

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

Sudo dpkg-reconfigure dash

dash fournit certaines fonctionnalités que bash ne propose pas, telles que:

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!

0
NerdOfLinux