Lors de l'écriture de programmes shell, nous utilisons souvent /bin/sh
et /bin/bash
. J'utilise habituellement bash
, mais je ne sais pas quelle est la différence entre eux.
Quelle est la principale différence entre bash
et sh
?
Que devons-nous savoir lors de la programmation dans bash
et sh
?
Réponses:
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 desh
(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 unesh
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 soibash
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 quesh
.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):sh
versdash
par défaut;initramfs
. Il utilise l'ash
implémentation du shell.pdksh
, un descendant du shell Korn. FreeBSDsh
est un descendant du shell UNIX Bourne d'origine. Solaris a la siennesh
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:Si c'est un lien dur, essayez
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 besoinfind
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
utilisera
sh
(et quoi que ce soit qui pointe),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 exempleLequel utiliser
Pour mes propres scripts, je préfère
sh
pour les raisons suivantes: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. Plainsh
est un langage de programmation très minimaliste.la source
bash
la manière d'affichage des messages d'erreur plus utiles en cas d'erreur de syntaxe. Vous pouvez simplement gagner du temps en utilisant bash.%
signifie au début de vos lignes de commande?$
place de%
, ou#
pour le shell racine.$
et#
...sh
existait bien avant bash (qui signifie bourne-again shell). Mais c'était très primitif et ne répondait pas aux événements terminaux, comme lesESC
personnages. Puisksh
est venu (également avant bash), puis bash a commencé par ceux qui aimaient l'idée d'un meilleur shell, mais détestaient ksh. :-)sh
: http://man.cx/shbash
: http://man.cx/bashTL; DR :
bash
est un sur-ensemble desh
avec une syntaxe plus élégante et plus de fonctionnalités. Il est sûr d'utiliser une ligne bash shebang dans presque tous les cas car elle est assez omniprésente sur les plates-formes modernes.NB: dans certains environnements,
sh
c'estbash
. Vérifiezsh --version
.la source
Cette question a souvent été désignée comme canonique pour les personnes qui essaient d'utiliser
sh
et sont surpris qu'elle ne se comporte pas de la même manière quebash
. Voici un bref aperçu des malentendus et des pièges courants.Tout d'abord, vous devez savoir à quoi vous attendre.
sh scriptname
, ou exécutez-le avecscriptname
et avez#!/bin/sh
dans la ligne shebang , vous devez vous attendre à unsh
comportement POSIX .bash scriptname
, ou l'exécutez avecscriptname
et avez#!/bin/bash
(ou l'équivalent local) dans la ligne shebang, vous devez vous attendre à un comportement Bash.Avoir un shebang correct et exécuter le script en tapant juste le nom du script (éventuellement avec un chemin relatif ou complet ) est généralement la solution préférée. En plus d'un shebang correct, cela nécessite que le fichier de script ait la permission d'exécution (
chmod a+x scriptname
).Alors, comment diffèrent-ils réellement?
Le manuel de référence Bash contient une section qui tente d'énumérer les différences, mais certaines sources courantes de confusion incluent
[[
n'est pas disponible ensh
(seulement[
ce qui est plus maladroit et limité).sh
n'a pas de tableaux.local
,source
,function
,shopt
,let
,declare
etselect
ne sont pas portablessh
. (Certainessh
implémentations prennent en charge par exemplelocal
.)for((i=0;i<=3;i++))
boucle,+=
affectation incrément, etc. La$'string\nwith\tC\aescapes'
fonction est provisoirement acceptée pour POSIX ( ce qui signifie qu'il fonctionne dans Bash maintenant, mais pas encore être pris en charge parsh
les systèmes qui adhèrent seulement au courant Spécification POSIX, et ne le sera probablement pas avant un certain temps).<<<'here strings'
.*.{png,jpg}
et{0..12}
accroît l'expansion.C'est dans POSIX, mais peut être absent de certaines~
se réfère$HOME
uniquement à Bash (et plus généralement~username
au répertoire personnel deusername
)./bin/sh
implémentations pré-POSIX .<(cmd)
et>(cmd)
.&|
pour2>&1 |
et&>
pour> ... 2>&1
<>
redirection.${substring:1:2}
, la${variable/pattern/replacement}
conversion de cas, etc.$[expression]
syntaxe héritée obsolète qui doit cependant être remplacée par une$((expression))
syntaxe arithmétique POSIX . (Certainessh
implémentations pré-POSIX héritées peuvent ne pas prendre en charge cela, cependant.)$RANDOM
,$SECONDS
,$PIPESTATUS[@]
et$FUNCNAME
sont des extensions Bash.export variable=value
et[ "x" == "y" ]
qui ne sont pas portables (export variable
doivent être séparées de l'affectation des variables, et la comparaison de chaînes portable[ ... ]
utilise un seul signe égal).N'oubliez pas qu'il s'agit d'une liste abrégée. Reportez-vous au manuel de référence pour le scoop complet, et http://mywiki.wooledge.org/Bashism pour de nombreuses bonnes solutions de contournement; et / ou essayez http://shellcheck.net/ qui met en garde contre de nombreuses fonctionnalités Bash uniquement.
Une erreur courante consiste à avoir une
#!/bin/bash
ligne shebang, mais à utiliser néanmoinssh scriptname
pour exécuter réellement le script. Cela désactive essentiellement toute fonctionnalité Bash uniquement, vous obtenez donc des erreurs de syntaxe, par exemple pour essayer d'utiliser des tableaux. (La ligne shebang est syntaxiquement un commentaire, elle est donc simplement ignorée dans ce scénario.)Malheureusement, Bash ne vous avertit pas lorsque vous essayez d'utiliser ces constructions lorsqu'il est invoqué en tant que
sh
. Il ne désactive pas non plus complètement toutes les fonctionnalités de Bash uniquement, donc exécuter Bash en l'invoquantsh
n'est pas un bon moyen de vérifier si votre script est correctement portable surash
/dash
/ POSIXsh
ou des variantes comme Heirloomsh
la source
export variable=value
est mandaté par POSIX: pubs.opengroup.org/onlinepubs/009695399/utilities/export.html . Peut-être que ce n'est pas disponible dans certains coquillages anciens, mais ce n'est certainement pas un bashisme.Shell est une interface entre un utilisateur et le système d'exploitation pour accéder aux services d'un système d'exploitation. Il peut s'agir d'une interface graphique ou d'une interface de ligne de commande (CLI).
sh (Bourne sh ell) est un interpréteur de ligne de commande shell, pour les systèmes d'exploitation Unix / Unix. Il fournit des commandes intégrées. Dans le langage de script, nous désignons l'interpréteur comme
#!/bin/sh
. Il était l'un des plus largement pris en charge par d'autres shells comme bash (gratuit / ouvert), kash (non gratuit).Bash ( B ourne a gain s hell) est un remplacement de shell pour le shell Bourne. Bash est un surensemble de sh. Bash prend en charge sh. POSIX est un ensemble de normes définissant le fonctionnement des systèmes compatibles POSIX. Bash n'est pas en fait un shell compatible POSIX. Dans un langage de script, nous désignons l'interpréteur comme
#!/bin/bash
.Analogie:
la source
sh
(c'est donc une "sous-classe" au sens de la POO) et l'étend (donc a un surensemble de la fonctionnalité).Message d' UNIX.COM
Caractéristiques du shell
Ce tableau ci-dessous répertorie la plupart des fonctionnalités qui, je pense, vous inciteraient à choisir un shell plutôt qu'un autre. Il n'est pas destiné à être une liste définitive et n'inclut pas toutes les fonctionnalités possibles pour chaque shell possible. Une fonctionnalité n'est considérée comme étant dans un shell que dans la version fournie avec le système d'exploitation, ou si elle est disponible telle que compilée directement à partir de la distribution standard. En particulier, le shell C spécifié ci-dessous est celui disponible sur SUNOS 4. *, un nombre considérable de fournisseurs expédient désormais soit tcsh soit leur propre shell C amélioré à la place (ils ne rendent pas toujours évident qu'ils expédient tcsh.
Code:
Clé du tableau ci-dessus.
La fonctionnalité Y peut être effectuée à l'aide de ce shell.
N La fonctionnalité n'est pas présente dans le shell.
F La fonctionnalité ne peut être effectuée qu'en utilisant le mécanisme de fonction des coques.
L La bibliothèque readline doit être liée au shell pour activer cette fonctionnalité.
Remarques sur le tableau ci-dessus
la source
TERMINAL
COQUILLE
SH Vs. FRAPPER
SH
FRAPPER
MATÉRIEL DE RÉFÉRENCE:
COQUILLE gnu.org:
BASH gnu.org:
la source
D'autres réponses ont généralement souligné la différence entre Bash et un standard shell POSIX. Cependant, lors de l'écriture de scripts shell portables et de l'utilisation de la syntaxe Bash, une liste de bashismes typiques et de solutions POSIX pures correspondantes est très pratique. Cette liste a été compilée lorsque Ubuntu est passé de Bash à Dash en tant que shell système par défaut et peut être trouvée ici: https://wiki.ubuntu.com/DashAsBinSh
De plus, il existe un excellent outil appelé checkbashisms qui vérifie les bashismes dans votre script et est pratique lorsque vous voulez vous assurer que votre script est portable.
la source
Ils sont presque identiques mais
bash
ont plus de fonctionnalités -sh
est (plus ou moins) un sous-ensemble plus ancien debash
.sh
signifie souvent l'originalBourne shell
, qui est antérieurbash
(Bourne *again* shell
), et a été créé en 1977. Mais, dans la pratique, il peut être préférable de le considérer comme un shell hautement compatible avec la norme POSIX de 1992.Les scripts qui commencent par
#!/bin/sh
ou utilisent lesh
shell le font généralement pour une compatibilité ascendante. Tout OS unix / linux aura unsh
shell. Sur Ubuntu, il estsh
souvent appelédash
et sur MacOS, il s'agit d'une version spéciale POSIX debash
. Ces coques peuvent être préférées pour un comportement conforme aux normes, une vitesse ou une compatibilité descendante.bash
est plus récent que l'originalsh
, ajoute plus de fonctionnalités et cherche à être rétrocompatible avecsh
. En théorie, lessh
programmes devraient fonctionnerbash
.bash
est disponible sur presque toutes les machines linux / unix et généralement utilisé par défaut - à l'exception notable de MacOS par défaut àzsh
partir de Catalina (10.15). FreeBSD, par défaut, n'est pas fourni avecbash
installé.la source
sh
est bien antérieure à POSIX. De nos jours, vous espérez que tout ce quesh
vous trouverez est au moins compatible POSIX; mais sur les systèmes existants, ce n'est en aucun cas une donnée. POSIX stadardise bien plus que le shell; en fait, vous pourriez faire valoir que la standardisation des appels du système d'exploitation et des fonctions de bibliothèque est plus importante./bin/sh
peut ou non invoquer le même programme que/bin/bash
.sh
prend en charge au moins les fonctionnalités requises par POSIX (en supposant une implémentation correcte). Il peut également prendre en charge les extensions.bash
, le "Bourne Again Shell", implémente les fonctionnalités requises pour les extensions sh plus spécifiques à bash. L'ensemble complet d'extensions est trop long pour être décrit ici et varie selon les nouvelles versions. Les différences sont documentées dans le manuel bash. Tapezinfo bash
et lisez la section «Fonctions Bash» (section 6 dans la version actuelle), ou lisez la documentation actuelle en ligne .la source
sh
vous donne uniquement un shell POSIX, si vous avez la bonnePATH
configuration dans votre shell actuel. Il n'y a pas de nom de chemin défini qui vous donne un shell POSIX.sh
on ne vous donnait même pas forcément un shell POSIX, sur Solaris par exemple.bash et sh sont deux coquilles différentes. Fondamentalement, bash est sh, avec plus de fonctionnalités et une meilleure syntaxe. La plupart des commandes fonctionnent de la même façon, mais elles sont différentes.Bash (bash) est l'un des nombreux shells Unix disponibles (mais les plus couramment utilisés). Bash signifie "Bourne Again SHell", et est un remplacement / amélioration du shell Bourne d'origine (sh).
Les scripts shell sont des scripts dans n'importe quel shell, tandis que les scripts Bash sont des scripts spécifiquement pour Bash. En pratique, cependant, "script shell" et "script bash" sont souvent utilisés de manière interchangeable, sauf si le shell en question n'est pas Bash.
Cela dit, vous devriez réaliser que / bin / sh sur la plupart des systèmes sera un lien symbolique et n'invoquera pas sh. Dans Ubuntu / bin / sh utilisé pour se lier à bash, comportement typique sur les distributions Linux, mais a maintenant changé pour se lier à un autre shell appelé dash. J'utiliserais bash, car c'est à peu près la norme (ou du moins la plus courante, d'après mon expérience). En fait, des problèmes surviennent lorsqu'un script bash utilise #! / Bin / sh parce que le créateur du script suppose que le lien est vers bash alors qu'il ne doit pas l'être.
la source
Les différences sont aussi simples que possible: après avoir une compréhension de base, les autres commentaires postés ci-dessus seront plus faciles à saisir.
Shell - "Shell" est un programme qui facilite l'interaction entre l'utilisateur et le système d'exploitation (noyau). Il existe de nombreuses implémentations de shell disponibles, comme sh, bash, csh, zsh ... etc.
En utilisant l'un des programmes Shell, nous pourrons exécuter des commandes prises en charge par ce programme Shell.
Bash - Il dérive de B ourne- un gain Sh ell. En utilisant ce programme, nous pourrons exécuter toutes les commandes spécifiées par Shell. De plus, nous pourrons exécuter certaines commandes qui sont spécifiquement ajoutées à ce programme. Bash a une compatibilité descendante avec sh.
Sh - Il dérive de Bourne Sh ell. "sh" prend en charge toutes les commandes spécifiées dans le shell. Moyens, En utilisant ce programme, nous pourrons exécuter toutes les commandes spécifiées par Shell.
Pour plus d'informations, procédez comme suit : - https://man.cx/sh - https://man.cx/bash
la source
Le système d'exploitation Linux propose différents types de shell. Bien que les shells aient de nombreuses commandes en commun, chaque type a des caractéristiques uniques. Étudions différents types de coques principalement utilisées.
Coquille Sh:
Sh shell est également connu sous le nom de Bourne Shell. Sh shell est le premier shell développé pour les ordinateurs Unix par Stephen Bourne aux Bell Labs d'AT & T en 1977. Il comprend de nombreux outils de script.
Coque Bash:
Bash shell signifie Bourne Again Shell. Le shell Bash est le shell par défaut dans la plupart des distributions Linux et remplace Sh Shell (le shell Sh s'exécutera également dans le shell Bash). Bash Shell peut exécuter la grande majorité des scripts shell Sh sans modification et fournir également une fonction d'édition de ligne de commande.
la source