Quelle est la difference entre bash et sh?

28

Je vois deux types de code utilisés:

#!/usr/bin/sh

et:

#!/user/bin/bash

J'ai cherché ceci en ligne et les opinions varient beaucoup. Les explications que j'ai vues sur la plupart des sites Web disent que shc'est plus ancien que bash, et qu'il n'y a pas de réelle différence.

Est-ce que quelqu'un connaît la différence entre ces derniers? Pouvez-vous me donner un exemple pratique quand utiliser l'un sur l'autre?

Saif Bechan
la source
pour un aperçu général des différents obus (pas seulement shet bash): http://en.wikipedia.org/wiki/Comparison_of_command_shells
akira
1
Une autre grande histoire ici: faqs.org/faqs/unix-faq/shell/shell-differences
John Wright

Réponses:

34

bashest un surensemble de shie. tout ce que vous pouvez faire, shvous pouvez le faire bash.

Bash a plus de fonctionnalités (branchement, builtins, tableaux) facilitant l'écriture du script. Certains * nix'es plus tard ont /bin/shun lien vers/bin/bash

Pour une explication complète de ce qui est ici un tutoriel

Nifle
la source
5
@Saif Bechan: L'une des raisons pour lesquelles le shell Bourne ( sh) n'a pas été simplement étendu est que Bash` a été écrit par quelqu'un d'autre. Je parie également qu'il y avait des problèmes de licence. Lire l'article sur le Bourne Shell en.wikipedia.org/wiki/Bourne_shell
Felix
7
La suppression shcasserait beaucoup de scripts qui s'attendent à ce qu'elle soit là et dépendent de la façon dont elle analyse les choses. Les utilisateurs de Linux peuvent ne pas s'en soucier, mais les gens qui dépensent des milliers de dollars sur Solaris, AIX ou HP-UX peuvent être très ennuyés.
2010
3
... et pour encore plus de plaisir, des liens symboliques Ubuntu / bin / sh au tiret. Dash n'est pas complètement compatible sh ou bash, mais est censé démarrer plus rapidement. Lorsque le système démarre, tous les scripts init.d s'exécutent et je suppose que le temps économisé en vaut la peine.
kbyrd
8
Je suis presque sûr que Dash est complètement compatible sh. Le problème est que certaines personnes écrivent des scripts qui disent / bin / sh, mais le script lui-même nécessite / bin / bash pour fonctionner. Personne ne remarque de problème, car la plupart du temps, / bin / sh pointe simplement vers / bin / bash.
davr
8
@Saif: Il y a une autre raison pour laquelle il shn'a pas été simplement étendu: son code source est un enfer pur. Regarde. C'est censé être C ...
grawity
6

Traditionnellement, / bin / sh aurait été le shell Bourne d'origine, qui n'a pas d'historique ni de modification en ligne de commande, et aucun contrôle de tâche.

Depuis environ 15 ans environ, la plupart des Unix ont eu le shell POSIX installé, ou au moins ksh ou bash (qui sont très similaires à POSIX), mais ont toujours le shell plus limité dans / bin / sh

La raison en est que les anciens scripts shell qui attendent l'ancienne shcommande continueront de fonctionner.
Depuis des personnages comme {, }et !ont une signification particulière pour bash, il est possible qu'un script shell plus en utilisant les caractères (sans les échapper) pourrait échouer.
(Le shell Bourne prendrait !!{1,2}littéralement, tandis que bash interpréterait cela comme une répétition de la commande précédente ( !!) suivie d'une extension d'accolade).

Sur Linux cependant, la shcommande est presque toujours juste un lien vers bash, avec toutes les mêmes fonctionnalités.

njd
la source
2
Bash est censé (mais pas toujours) se comporter en mode de compatibilité sh s'il est invoqué en tant que / bin / sh. Beaucoup de choses se sont cassées quand Ubuntu est passé de / bin / sh de la liaison à / bin / bash à la liaison à / bin / dash. Les trucs qui ont cassé supposaient des bashismes alors qu'ils auraient dû utiliser du sh standard.
Broam
4

sh peut signifier Bourne shell ou / bin / sh, qui est un autre shell (conforme POSIX) sur la plupart des plates-formes modernes. "Le shell POSIX" est le shell abstrait défini par POSIX , qui est implémenté par bash en mode POSIX, ou ksh ou dash par défaut. / bin / sh est parfois également appelé shell POSIX, car il s'agit d'un shell conforme à POSIX sur la plupart des plates-formes. Les coquilles Bourne d'origine ne sont pas des coquilles POSIX.

bashref a une liste de différences entre les coquilles bash et Bourne . man basha une liste de modifications lorsque bash est appelé en mode POSIX .

/ bin / sh n'est pas un lien symbolique ou un lien dur sous OS X, mais c'est presque la même taille que / bin / bash:

$ ls -li /bin/{ba,}sh
29631757 -r-xr-xr-x  1 root  wheel  1333920 Jul 26 01:52 /bin/bash
29631758 -r-xr-xr-x  1 root  wheel  1334000 Jul 26 01:52 /bin/sh

homme bash :

Si bash est appelé avec le nom sh, il essaie d'imiter le comportement de démarrage des versions historiques de sh aussi fidèlement que possible, tout en se conformant également à la norme POSIX.

L'imitation des coquilles Bourne est par ailleurs assez limitée. bash +B(Bourne) désactiverait en fait des fonctionnalités telles que l'expansion de l'accolade.

$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}

Mais même si vous désactivez le mode POSIX, l'écho se comporte comme echo -epar défaut:

$ sh
$ shopt -uo posix
$ echo '1\b2'
2

/ bin / sh est un tiret sur Ubuntu , donc certains bashismes fonctionnent avec / bin / sh sur OS X mais pas Ubuntu.

Si vous voulez réellement écrire des scripts pour (quelque chose comme) les shells Bourne d'origine, vous pouvez utiliser à la #!/usr/bin/env bash +Bplace.

Je pense qu'il est plus facile d'écrire des scripts pour bash que d'éviter des fonctionnalités qui ne font pas partie des spécifications POSIX ou des shells Bourne ou de tout tester avec d'autres shells.

Lri
la source
2

En fait, même si / bin / sh peut être un lien vers / bin / bash, s'il est démarré comme sh, il se comporte différemment. Depuis la page de manuel bash:

Si bash est appelé avec le nom sh, il essaie d'imiter le comportement de démarrage des versions historiques de sh aussi fidèlement que possible, tout en se conformant également à la norme POSIX.

Ainsi sh, il essaie d'imiter le comportement historique de sh. En tant que bash, il essaie d'être aussi utile que possible comme un shell de connexion interactif.

KeithB
la source
2

Sur de nombreux systèmes et sur Solaris en particulier, bash est lié dynamiquement tandis que sh est lié statiquement. Cela peut constituer une menace pour la sécurité, pour cette raison, l'utilisateur root ne doit utiliser que / bin / sh comme shell (si vous devez vous connecter en tant que root).

Alessandro Vozza
la source
2
Peut également être utile en cas d'urgence si vous avez fait quelque chose de mal ldconfigou si votre /librépertoire est effacé pour une raison quelconque.
LawrenceC