61 votes

Quel est l'intérêt pour sh d'être lié à dash ?

Je me demande quel est l'intérêt de sh étant symboliquement lié à dash est ? Je comprends que dash est censé être plus rapide que bash mais je ne sais pas pourquoi l'original sh Shell n'est pas présent dans sh .

Ou si quelque chose, pourquoi n'est pas sh lié à bash ?

109voto

Schof Points 952

La réponse courte à la question "pourquoi le sh Shell d'origine n'est pas présent en sh " est qu'il n'y a pas de sh original.

Bon, ok, il y en a un : c'est le Thompson Shell . La version 1 possédait certaines des fonctionnalités que nous connaissons aujourd'hui, en particulier la redirection et les pipes (lire L'article de Dennis Ritchie sur les débuts d'Unix. ). Versions ultérieures des fonctionnalités supplémentaires telles que l'exécution en arrière-plan avec & Il n'y avait pas de variables ou de structures de contrôle imbriquées, ni de globbing (implémenté avec un programme externe), ni de citation. Les conditionnels et les boucles étaient fournis par des programmes externes. if (qui prend une condition et une commande comme arguments) et goto (qui a fonctionné en changeant la position du fichier de son parent dans le fichier script).

En 1979, dans Unix V7 la Thompson Shell a été remplacée par la suivante /bin/sh par le Bourne Shell . La première version avait déjà de nombreuses fonctionnalités qui sont présents dans le tableau de bord aujourd'hui, et les versions ultérieures introduites beaucoup plus . Quelques années plus tard, le Korn Shell est apparu sur la scène, avec un ensemble de fonctionnalités croissant ; de nombreuses variantes d'Unix l'ont installé sous le nom de ksh .

En 1992, POSIX cod cod cod cod codé un ensemble minimum sh qui était en fait Bourne avec quelques trucs en plus. Tout système qui s'appelait "Unix" devait implémenter au moins ces fonctionnalités. Les systèmes Unix commerciaux utilisent généralement ksh comme sh POSIX, mais quelques-uns (par ex. OSF/1 ) avaient les leurs.

Ni le Shell de Bourne ni le Shell de Korn n'étaient open source jusqu'à assez récemment, donc lorsque le monde Linux a commencé à se former au milieu des années 1990, ils n'étaient pas disponibles. /bin/sh devait être quelque chose d'autre. La plupart des distributions Linux ont choisi bash un Shell de l'équipe de la Projet GNU qui se situait entre Bourne et Korn en termes de fonctionnalités de script, et bien meilleur qu'eux pour une utilisation interactive). La seule alternative viable était pdksh ("public domain Korn Shell"), une application libre (aujourd'hui abandonnée, mais vivant sous le nom de mksh qui est développé activement ), mais je n'ai pas souvenir d'une distribution Linux utilisant pdksh en tant que /bin/sh Je ne sais pas pourquoi, je suppose que c'est parce que les distributions Linux ont toujours été des distributions GNU/Linux, fournissant essentiellement des versions GNU de tous les outils pour lesquels une version GNU existe.

Il existe également plusieurs implémentations open source de sh appelés "cendres", notamment le Almquist Shell mais ils étaient très incomplets, manquant de certaines fonctionnalités POSIX que les gens voulaient utiliser. Un programmeur qui était un mainteneur Debian, Herbert Xu , extended ash pour le rendre conforme à POSIX. Finalement, sa version a été renommée en dash, et il y a eu une certaine pression pour qu'elle devienne /bin/sh dans Debian au lieu de bash. Ubuntu a démarré avant que Debian ne commence à traiter systématiquement les bashismes (l'utilisation de fonctionnalités propres à bash dans #!/bin/sh scripts) en tant que bogues . Les deux ont commuté ultérieurement ( Ubuntu 6.10 Debian seulement en 2009 ( c'était un but pour Lenny mais le changement n'a été fait qu'après la sortie de Lenny, c'est-à-dire dans Squeeze)).

Un grand raison d'utiliser dash as plutôt que bash como /bin/sh est qu'il est beaucoup plus rapide. C'était particulièrement important pour Ubuntu, qui s'est efforcé de maintenir des temps de démarrage courts depuis le début. Dash a également tendance à utiliser moins de mémoire que bash, ce qui est quelque peu important pour les scripts d'emballage qui restent autour juste pour faire un peu de nettoyage lorsque le programme sous-jacent quitte. Un autre avantage de dash est qu'il ne s'appuie que sur libc (la bibliothèque centrale du système) alors que bash s'appuie également sur les bibliothèques de support du terminal (il ne peut pas démarrer sans elles, même pour exécuter un scripts) ; cela signifie que dash a une meilleure chance de continuer à fonctionner sur un système cassé.

À un moment donné au cours du 21e siècle, le Shell de Korn est devenu open source, et des versions open source du Shell de Bourne sont apparues (d'anciennes versions, car le développement avait cessé des années auparavant). Mais dash et bash étaient trop fermement ancrés dans le monde Linux pour qu'ils soient acceptés, surtout le Shell Bourne puisque sa valeur aujourd'hui n'est qu'historique. Dash a remplacé bash parce qu'il avait des avantages clairs, mais aucun des autres prétendants n'a d'avantage décisif comme /bin/sh .

27voto

Sergiy Kolodyazhnyy Points 97292

La vitesse et la conformité POSIX (en d'autres termes, la portabilité) sont les principaux facteurs. N'oubliez pas que /bin/sh est destiné aux scripts du système, qui peuvent ou non provenir d'anciennes versions d'Ubuntu et/ou d'autres systèmes.

Bien sûr, les fonctions brillantes de bash sont cool à utiliser pour nous utilisateurs, mais quand il s'agit de faire fonctionner quelque chose dans un environnement où vous devez gérer plusieurs serveurs/systèmes différents - avoir Shell conforme à POSIX fait toute la différence. Surtout, si vous êtes un nouvel administrateur système et que vous avez hérité d'un environnement avec de nombreux Shell.

Quant à savoir pourquoi le Bourne Shell original n'est pas présent, c'est simple - c'est un produit propriétaire appartenant à l'origine à AT&T Bell Labs.

De plus, il y a une explication explicite sur le wiki d'Ubuntu à ce sujet :

Pourquoi ce changement a-t-il été effectué ? La raison principale pour changer le Shell par défaut était l'efficacité. bash est un excellent Shell complet approprié pour une utilisation interactive ; en effet, il est toujours le Shell de connexion par défaut. Cependant, il est plutôt gros et lent à démarrer et à fonctionner en comparaison avec dash. Un grand nombre d'instances Shell sont lancées dans le cadre du processus de démarrage d'Ubuntu. Plutôt que de modifier chacune d'entre elles individuellement pour qu'elles s'exécutent explicitement sous /bin/dash, un changement qui nécessiterait une maintenance permanente importante et qui serait susceptible de régresser si l'on n'y prête pas une attention particulière, l'équipe de développement du noyau d'Ubuntu a estimé qu'il était préférable de modifier 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, qui est une excellente plateforme pour le développement futur du système init mais qui, dans Ubuntu 6.10, fonctionnait principalement en mode de compatibilité System V avec seulement de petits changements de comportement. Ces améliorations étaient en fait largement dues à la modification de /bin/sh.

Et voici une note sur la portabilité :

Le manuel des règles de Debian a longtemps imposé que "Shell Shell spécifiant '/bin/sh' comme interpréteur ne doit utiliser que des fonctionnalités POSIX" ; en fait, cette exigence est en place depuis bien avant le début du projet Ubuntu. En outre, tout Shell Shell qui s'attendait à être portable vers d'autres systèmes Unix, tels que les BSD ou Solaris, honorait 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

14voto

thomasrutter Points 33791

Dans les distributions GNU/Linux, l'"original" est le nom de l'utilisateur. /bin/sh " est en fait Bash.

GNU voulait un Shell de type Bourne qui soit sous GPL, c'est pourquoi ils ont choisi Bash pour leur /bin/sh au lieu de Bourne, qui n'était pas sous licence GPL. Les distributions modernes de Linux ont hérité de cette décision au point qu'elle est devenue un standard de facto pour les systèmes d'exploitation. /bin/sh pour être Bash. Le Bourne Shell original ("sh") a été utilisé dans d'autres Unix non-Linux, même aussi récemment que Solaris 10, mais il n'a jamais été un pilier dans les distributions Linux.

Commutation /bin/sh de bash à dash était une décision de Debian (héritée par Ubuntu) motivée en grande partie par la vitesse - elle est arrivée à un moment où ils ont fait un effort énorme pour améliorer la vitesse de démarrage, et une grande partie du temps CPU de démarrage à l'époque consistait à exécuter des init scripts.

Bash continue d'être utilisé comme Shell interactif/de connexion par défaut pour les utilisateurs, mais Dash est celui qui se trouve à /bin/sh et celui qui est exécuté pour les scripts du système comme init scripts.

Dash est très rapide, mais il est aussi très étroitement compatible avec POSIX - une norme qui s'aligne étroitement sur le Shell de Bourne. Donc, d'une certaine manière, en passant de Bash à Dash, nous revenons à un Shell plus étroitement aligné sur Bourne.

4voto

NerdOfLinux Points 3470

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

#!/bin/sh

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

Le changement a été fait de bash a dash car selon https://wiki.ubuntu.com/DashAsBinSh :

La raison principale pour changer le Shell par défaut était l'efficacité. bash est un excellent Shell complet approprié pour une utilisation interactive ; en effet, il est toujours le Shell de connexion par défaut. Cependant, il est plutôt gros et lent à démarrer et à fonctionner en comparaison avec dash. Un grand nombre d'instances Shell sont lancées dans le cadre du processus de démarrage d'Ubuntu. Plutôt que de modifier chacune d'entre elles individuellement pour qu'elles s'exécutent explicitement sous /bin/dash, un changement qui nécessiterait une maintenance permanente importante et qui serait susceptible de régresser si l'on n'y prête pas une attention particulière, l'équipe de développement du noyau d'Ubuntu a estimé qu'il était préférable de modifier simplement le Shell par défaut.

sh n'est pas lié à bash parce que

Le manuel des règles de Debian a longtemps imposé que "Shell Shell spécifiant '/bin/sh' comme interpréteur ne doit utiliser que des fonctionnalités POSIX".

Si vous voulez utiliser bash como /bin/sh :

Si les problèmes sont plus répandus et que vous voulez changer le système par défaut Shell en arrière, alors vous pouvez demander au système de gestion des paquets d'arrêter d'installer dash comme /bin/sh :

sudo dpkg-reconfigure dash

Il y a certaines fonctionnalités qui dash fournit que bash ne fournit pas, comme :

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X