Est-ce que bash et sh exécutent un script différemment? Jai exécuté un script shell avec bash et sh, et jai obtenu la même sortie. Alors, quelle est la différence?
De plus, lorsque vous exécutez simplement ./executable
, utilise-t-il bash ou sh?
Commentaires
Réponse
Cela dépend du système que vous utilisez. Un de nombreux systèmes dexploitation, en particulier ceux basés sur Linux, sh
est un lien vers bash
.
Dans ce cas, il Il existe encore des différences de comportement où bash
essaie de ressembler davantage à un bourne traditionnel lorsquil est appelé sh
, mais il accepte toujours la plupart des bashismes.
Sur certains autres systèmes dexploitation, comme ceux basés sur Debian, sh
est fourni par dash
, et non par bash
. Cela fait une bien plus grande différence car dash
ne prend pas en charge les bashismes, étant conçu pour être une implémentation propre du shell POSIX.
Sur les systèmes dexploitation propriétaires, sh
est souvent fourni par un ksh88
conforme POSIX qui, comme dash
, nimplémente pas les bashismes. Sur Solaris 10 et versions antérieures, en fonction de votre PATH, sh
sera probablement un ancien shell Bourne, antérieur à POSIX.
Dans tous les cas, vous avez probablement la même sortie avec votre test simplement parce que votre script nutilisait aucune commande, option ou syntaxe spécifique bash
.
Lorsque vous exécutez ./executable
, le shell qui sera exécuté dépend essentiellement du shebang écrit au début du script .executable. Ce sera bash
si le shebang le spécifie:
#!/bin/bash ....
Sil ny a pas de shebang et que vous appelez le script à partir dun shell compatible POSIX, le script doit techniquement être exécuté par le premier sh
trouvé dans le PATH. De nombreux interpréteurs de shell comme bash
, dash
et ksh
se considèrent comme POSIX, de même interpréter le script. Notez que la variable denvironnement SHELL
nest pas utilisée ici.
Commentaires
- Jai regardé autour de
/bin
et jai trouvé quesh
est un lien symbolique versdash
plutôt quebash
. Alors, comment ont-ils géré la même chose? Il nétait ' pas vraiment dexécuter des commandes de script bash, juste des commandes de terminal pour utiliser dautres outils '. - Si votre script shell appelle juste séquentiellement dautres commandes, nimporte quel interpréteur shell lexécutera avec le même résultat. Rien dinattendu ici.
- Ceci nest ' t lié à la question, mais quelle est exactement la différence entre
bash
etdash
? - Les deux utilisent la syntaxe du shell Bourne. Comme je lai écrit dans ma réponse,
dash
est une implémentation propre du standard de shell POSIX. Dautre part,bash
est un shell avec un assez grand nombre dextensions et de fonctionnalités non standard, certaines inspirées deksh
,ksh93
et dautres shells, et certains bash spécifiques, connus sous le nom de bashismes. Il existe un outil nommé checkbashisms qui permet didentifier tout ce qui nest pas strictement portable dans un script shell donné.
Réponse
Oui, cela pourrait être, mais ce nest pas nécessaire. Les deux coques ne sont pas les mêmes, mais les bases sont compatibles. Consultez cet article pour plus de détails.
Vous pouvez utiliser la ligne suivante dans un script pour vérifier linterpréteur utilisé:
ps h -p $$ -o args="" | cut -f1 -d" "
Vous pouvez spécifier explicitement le shell à utiliser lorsque le script est exécuté directement avec la ligne sheebang
:
#!/bin/sh
ou
#!/bin/bash
$SHELL
nest pas utilisée pour décider quel shell interprétera le./executable
scénario. Cela ne ' pas nécessairement dire quel est le shell actuel non plus.