Quel est sh
sh
(ou Shell Command Language) est un langage de programmation décrit par la norme POSIX . Il a de nombreuses implémentations ( ksh88
, dash
, ...). bash
peut également être considérée comme une implémentation de sh
(voir ci-dessous).
Parce que sh
c'est une spécification, pas une implémentation, /bin/sh
est un lien symbolique (ou un lien dur) vers une implémentation réelle sur la plupart des systèmes POSIX.
Qu'est-ce que bash
bash
a commencé comme une sh
implémentation compatible (bien qu'elle soit antérieure au standard POSIX de quelques années), mais avec le temps, elle a acquis de nombreuses extensions. Beaucoup de ces extensions peuvent changer le comportement des scripts shell POSIX valides, donc en soi bash
n'est pas un shell POSIX valide. Il s'agit plutôt d'un dialecte du langage shell POSIX.
bash
prend en charge un --posix
commutateur, ce qui le rend plus conforme à POSIX. Il essaie également d'imiter POSIX s'il est appelé en tant que sh
.
sh = bash?
Pendant longtemps, /bin/sh
utilisé pour pointer /bin/bash
sur la plupart des systèmes GNU / Linux. En conséquence, il était presque devenu sûr d'ignorer la différence entre les deux. Mais cela a commencé à changer récemment.
Voici quelques exemples populaires de systèmes sur lesquels /bin/sh
ne pointe pas /bin/bash
(et sur certains d'entre eux qui /bin/bash
n'existent même pas):
- Les systèmes Debian et Ubuntu modernes, qui ont un lien symbolique
sh
vers dash
par défaut;
- Busybox , qui est généralement exécuté pendant le démarrage du système Linux dans le cadre de
initramfs
. Il utilise l' ash
implémentation du shell.
- BSD, et en général tous les systèmes non Linux. OpenBSD utilise
pdksh
, un descendant du shell Korn. FreeBSD sh
est un descendant du shell UNIX Bourne d'origine. Solaris a la sienne sh
qui, pendant longtemps, n'était pas compatible POSIX; une implémentation gratuite est disponible à partir du projet Heirloom .
Comment pouvez-vous savoir ce qui /bin/sh
pointe sur votre système?
La complication est que cela /bin/sh
pourrait être un lien symbolique ou un lien dur. S'il s'agit d'un lien symbolique, un moyen portable de le résoudre est:
% file -h /bin/sh
/bin/sh: symbolic link to bash
Si c'est un lien dur, essayez
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
En fait, le -L
drapeau couvre à la fois les liens symboliques et les liens durs, mais l'inconvénient de cette méthode est qu'elle n'est pas portable - POSIX n'a pas besoin find
de prendre en charge l' -samefile
option, bien que GNU find et FreeBSD find la prennent en charge.
Ligne Shebang
En fin de compte, c'est à vous de décider laquelle utiliser, en écrivant la ligne «shebang» comme toute première ligne du script.
Par exemple
#!/bin/sh
utilisera sh
(et quoi que ce soit qui pointe),
#!/bin/bash
utilisera /bin/bash
s'il est disponible (et échouera avec un message d'erreur s'il ne l'est pas). Bien sûr, vous pouvez également spécifier une autre implémentation, par exemple
#!/bin/dash
Lequel utiliser
Pour mes propres scripts, je préfère sh
pour les raisons suivantes:
- il est standardisé
- c'est beaucoup plus simple et plus facile à apprendre
- il est portable sur tous les systèmes POSIX - même s’ils n’en ont pas
bash
, ils doivent avoirsh
Il y a aussi des avantages à utiliser bash
. Ses fonctionnalités rendent la programmation plus pratique et similaire à la programmation dans d'autres langages de programmation modernes. Ceux-ci incluent des éléments tels que des variables et des tableaux locaux étendus. Plain sh
est un langage de programmation très minimaliste.