Différence entre sh et bash
lorsque nous écrivons des 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
?
de quoi devons-nous être au courant lorsque nous programmons dans bash
et sh
?
10 réponses
qu'est-Ce que sh
sh
(ou le langage de commande Shell) est un langage de programmation décrit par le "POSIX 1519450920".
norme .
Il a de nombreuses implémentations ( ksh88
, dash
, ...). bash
peut aussi être
considéré comme une mise en œuvre de sh
(voir ci-dessous).
parce que sh
est une spécification, pas une implémentation, /bin/sh
est un lien symbolique
(ou un lien en dur) à une implémentation sur la plupart des systèmes POSIX.
qu'est-Ce que bash
bash
a commencé comme une implémentation compatible sh
(bien qu'elle soit antérieure de quelques années à la norme POSIX), mais avec le temps, elle a acquis de nombreuses extensions. Beaucoup de ces extensions peuvent changer le comportement des scripts de shell POSIX valides, donc bash
n'est pas un shell POSIX valide. C'est plutôt un dialecte du langage shell POSIX.
bash
supporte un commutateur --posix
, ce qui le rend plus conforme à POSIX. Il essaie aussi d'imiter POSIX s'il est invoqué comme sh
.
sh = bash?
pendant longtemps, /bin/sh
utilisé pour pointer vers /bin/bash
sur la plupart des systèmes GNU/Linux. En conséquence, il était presque devenu sans ignorer la différence entre les deux. Mais cela a commencé à changer récemment.
quelques exemples populaires de systèmes où /bin/sh
ne pointe pas à /bin/bash
(et sur certains dont /bin/bash
peut même ne pas exister) sont:
- les systèmes modernes Debian et Ubuntu, qui sont synlink
sh
àdash
par défaut; - Busybox , qui est généralement exécuté pendant le temps de démarrage du système Linux dans le cadre de
initramfs
. Il utilise l'implémentation du shellash
. - BSDs, et en général toute systèmes non-Linux. OpenBSD utilise
pdksh
, un descendant de la coquille de Korn. Lesh
de FreeBSD est un descendant du shell original D'UNIX Bourne. Solaris dispose de son propresh
qui, pendant longtemps, n'était pas conforme à POSIX; une implémentation gratuite est disponible sur le projet Heirloom .
Comment savoir ce que /bin/sh
indique sur votre système?
la complication est que /bin/sh
pourrait être un lien symbolique ou un lien en dur.
Si c'est un lien symbolique, une portable façon 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 drapeau -L
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 ne nécessite pas find
pour supporter le -samefile
option,
bien que les deux GNU find et FreeBSD find le supportent.
ligne Shebang
finalement, c'est à vous de décider lequel utiliser, en écrivant la ligne "shebang".
E. G.
#!/bin/sh
utilisera sh
(et quoi qu'il arrive pour pointer du doigt),
#!/bin/bash
va utiliser /bin/bash
si elle est disponible (et échouer avec un message d'erreur si elle n'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 normalisé
- il est beaucoup plus simple et plus facile d'apprendre
- il est portable à travers les systèmes POSIX - même s'ils ne se produisent pas pour avoir
bash
, ils doivent avoirsh
il y a aussi des avantages à utiliser bash
. Ses caractéristiques rendent la programmation plus commode et semblable à la programmation dans d'autres langages de programmation modernes. Cela inclut des choses comme des variables locales et des tableaux scoped. Plain sh
est un langage de programmation très minimaliste.
sh
: http://man.cx/sh
bash
: http://man.cx/bash
TL;DR : bash
est un super-ensemble de sh
avec une syntaxe plus élégante et plus de fonctionnalité. Il est sûr d'utiliser une ligne bash shebang dans presque tous les cas car il est assez omniprésent sur les plates-formes modernes.
NB: dans certains environnements, sh
est bash
. Cochez la case sh --version
.
Post de UNIX.COM
caractéristiques de la coque
ce tableau ci-dessous liste la plupart des fonctionnalités qui, je pense, vous feraient choisir un shell plutôt qu'un autre. Il n'est pas destiné à être une liste définitive et ne comprend pas toute seule caractéristique pour chaque obus. Une fonction n'est considéré comme être dans un shell si dans la version qui vient avec le système d'exploitation, ou si elle est disponible tel que compilé directement à partir de la distribution standard. En particulier, la coque en C spécifiée ci-dessous est celle disponible sur SUNOS 4.* , un nombre considérable de vendeurs expédient maintenant des tcsh ou leur propre coque en C améliorée à la place (ils ne rendent pas toujours évident qu'ils expédient des tcsh.
Code:
sh csh ksh bash tcsh zsh rc es
Job control N Y Y Y Y Y N N
Aliases N Y Y Y Y Y N N
Shell functions Y(1) N Y Y N Y Y Y
"Sensible" Input/Output redirection Y N Y Y N Y Y Y
Directory stack N Y Y Y Y Y F F
Command history N Y Y Y Y Y L L
Command line editing N N Y Y Y Y L L
Vi Command line editing N N Y Y Y(3) Y L L
Emacs Command line editing N N Y Y Y Y L L
Rebindable Command line editing N N N Y Y Y L L
User name look up N Y Y Y Y Y L L
Login/Logout watching N N N N Y Y F F
Filename completion N Y(1) Y Y Y Y L L
Username completion N Y(2) Y Y Y Y L L
Hostname completion N Y(2) Y Y Y Y L L
History completion N N N Y Y Y L L
Fully programmable Completion N N N N Y Y N N
Mh Mailbox completion N N N N(4) N(6) N(6) N N
Co Processes N N Y N N Y N N
Builtin artithmetic evaluation N Y Y Y Y Y N N
Can follow symbolic links invisibly N N Y Y Y Y N N
Periodic command execution N N N N Y Y N N
Custom Prompt (easily) N N Y Y Y Y Y Y
Sun Keyboard Hack N N N N N Y N N
Spelling Correction N N N N Y Y N N
Process Substitution N N N Y(2) N Y Y Y
Underlying Syntax sh csh sh sh csh sh rc rc
Freely Available N N N(5) Y Y Y Y Y
Checks Mailbox N Y Y Y Y Y F F
Tty Sanity Checking N N N N Y Y N N
Can cope with large argument lists Y N Y Y Y Y Y Y
Has non-interactive startup file N Y Y(7) Y(7) Y Y N N
Has non-login startup file N Y Y(7) Y Y Y N N
Can avoid user startup files N Y N Y N Y Y Y
Can specify startup file N N Y Y N N N N
Low level command redefinition N N N N N N N Y
Has anonymous functions N N N N N N Y Y
List Variables N Y Y N Y Y Y Y
Full signal trap handling Y N Y Y N Y Y Y
File no clobber ability N Y Y Y Y Y N F
Local variables N N Y Y N Y Y Y
Lexically scoped variables N N N N N N N Y
Exceptions N N N N N N N Y
touche du tableau ci-dessus.
La fonctionnalitéY peut être réalisée en utilisant cette coquille.
La caractéristiqueN n'est pas présente dans l'interpréteur de commandes.
F caractéristique ne peut être fait en utilisant la fonction shells mécanisme.
L la bibliothèque readline doit être liée dans le shell pour activer cette Fonctionnalité.
Notes au tableau ci-dessus
1. This feature was not in the original version, but has since become
almost standard.
2. This feature is fairly new and so is often not found on many
versions of the shell, it is gradually making its way into
standard distribution.
3. The Vi emulation of this shell is thought by many to be
incomplete.
4. This feature is not standard but unofficial patches exist to
perform this.
5. A version called 'pdksh' is freely available, but does not have
the full functionality of the AT&T version.
6. This can be done via the shells programmable completion mechanism.
7. Only by specifying a file via the ENV environment variable.
cette question a souvent été désignée comme canonique pour les gens qui essaient d'utiliser sh
et sont surpris qu'elle ne se comporte pas de la même façon que bash
. Voici un bref aperçu des malentendus et des pièges courants.
tout d'Abord, vous devez comprendre à quoi s'attendre.
- si vous exécutez votre script avec
sh scriptname
, ou l'exécutez avecscriptname
et avez#!/bin/sh
dans le shebang Ligne , vous devez vous attendre à un comportement POSIXsh
. - si vous exécutez votre script avec
bash scriptname
, ou l'exécutez avecscriptname
et avez#!/bin/bash
(ou l'équivalent local) dans la ligne de 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'une bonne shebang, cela nécessite que le fichier script ait la permission d'exécuter ( chmod a+x scriptname
).
alors, en quoi diffèrent-ils réellement?
Le Bash manuel de Référence a un qui tente d'énumérer les différences mais certaines sources de confusion inclure
-
[[
n'est pas disponible danssh
([
qui est plus maladroit et limitée). -
sh
n'a pas de tableaux. - certains mots clés Bash comme
local
,function
, etselect
ne sont pas portables àsh
. - Bash a de nombreuses extensions de syntaxe de style C comme
$'string\nwith\tC\aescapes'
et les trois argumentsfor((i=0;i<=3;i++))
boucle,+=
assignation incrémentielle, etc. - Bash prend en charge
<<<'here strings'
. - Bash a
*.{png,jpg}
et{0..9}
brace expansion. -
~
se réfère à$HOME
uniquement dans Bash (et plus généralement~username
dans le répertoire personnel deusername
). - Bash a processus de substitution avec des
<(cmd)
et>(cmd)
. - Bash supporte les coprocessions avec
<>
redirection. - Bash a considérablement étendu les installations pour l'arithmétique de coque (bien que toujours pas de soutien flottant) et manipulation de substrats variables avec
${substring:1:2}
,${variable/pattern/replacement}
, conversion de cas, etc. - beaucoup, beaucoup d'extensions Bash-only pour activer ou désactiver le comportement optionnel et exposer l'état interne du shell.
- beaucoup, beaucoup de fonctionnalités pratiques pour une utilisation interactive qui n'affectent toutefois pas le comportement du script.
rappelez-vous, ceci est une liste abrégée. Se reporter au manuel de référence pour obtenir le tableau complet, et http://mywiki.wooledge.org/Bashism pour plusieurs bonnes solutions de rechange; et / ou essayez http://shellcheck.net / qui avertit pour de nombreuses fonctionnalités Bash-only.
une erreur courante est d'avoir une ligne shebang #!/bin/bash
, mais d'utiliser néanmoins sh scriptname
pour exécuter le script. Cela désactive fondamentalement toute fonctionnalité de Bash-only, de sorte que vous obtenez des erreurs de syntaxe par exemple pour essayer d'utiliser des tableaux.
Malheureusement, Bash pas avertir lorsque vous essayez d'utiliser ces constructions lorsqu'elle est invoquée comme sh
. Il ne désactive pas complètement toutes les fonctionnalités Bash-only, donc lancer Bash en l'invoquant comme sh
n'est pas une bonne façon de vérifier si votre script est correctement portable à ash
/ dash
/POSIX sh
.
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 de GUI ou de CLI (interface en ligne de commande).
sh (Bourne sh ell) est un interpréteur de commandes shell. Il fournit quelques commandes intégrées. Dans le langage de script, nous désignons l'interprète comme #!/bin/sh
. Il a été l'un des plus largement soutenu par d'autres coquilles, comme bash (free/open), kash (pas gratuit).
Bash ( B ourne un gain s l'enfer) est un shell de remplacement pour le Bourne shell. Bash est sur-ensemble de sh. Bash prend en charge sh. POSIX est un ensemble de normes définissant le fonctionnement des systèmes conformes à POSIX. Bash n'est pas en fait un shell compatible POSIX. Dans un langage de script nous noterons l'interprète comme #!/bin/bash
.
analogie:
- Coquille est comme une interface ou des caractéristiques ou de l'API.
- sh est une classe qui implémente l'interface Shell.
- Bash est une sous-classe de la sh.
TERMINAL
- programme(s) qui mettent une fenêtre vers le haut
- xterm, rxvt, konsole, kvt, gnome-terminal, nxterm, et eterm.
SHELL
- est un programme qui tourne dans le terminal
- Shell est à la fois un interpréteur de commandes et un langage de programmation
- Shell est simplement une macro processeur qui exécute les commandes.
- Macro processeur signifie fonctionnalité où le texte et les symboles sont développés pour créer des expressions plus grandes.
SH Vs. BASH
SH
- (SHell)
- est une enveloppe spécifique
- un interprète de commande et un langage de programmation
- Prédécesseur de BASH
BASH
- (Bourne-Again SHell)
- est une enveloppe spécifique
- un interprète de commande et un langage de programmation
- a la fonctionnalité sh et plus
- successeur de SH
- BASH est le SHELL par défaut
MATÉRIAU DE RÉFÉRENCE:
SHELL gnu.org:
à sa base, un shell est simplement un macro processeur qui exécute commande. Le terme macro processeur signifie la fonctionnalité où le texte et les symboles sont élargis pour créer des expressions plus larges.
un shell Unix est à la fois un interpréteur de commandes et un programmeur langue. En tant qu'interpréteur de commandes, le shell fournit l'interface utilisateur un riche ensemble D'utilitaires GNU. Les caractéristiques du langage de programmation permettent ces services doivent être combinés. Les fichiers contenant des commandes peuvent être créés, et deviennent des commandements eux-mêmes. Ces nouvelles commandes ont le même statut que les commandes système dans les répertoires tels que / bin, permettant utilisateurs ou groupes pour établir des environnements personnalisés pour automatiser leurs tâches courantes.
coquillages peut être utilisé de manière interactive ou non interactive. En interactif mode, ils acceptent les entrées tapées à partir du clavier. Lors de l'exécution de non-interactivement, les shells exécutent des commandes lues à partir d'un fichier.
un shell permet l'exécution de commandes GNU, à la fois synchrone et asynchrone. Le shell attend les commandes synchrones pour terminer avant d'accepter plus d'entrées; les commandes asynchrones continuent d'exécuter en parallèle avec la coque alors qu'il lit et exécute les supplémentaire commande. Les constructions de redirection permettent un contrôle fin de l'entrée et la sortie de ces commandes. De plus, la coque permet contrôle du contenu des environnements des commandes.
Les Shellsfournissent également un petit ensemble de commandes intégrées (builtins) mise en œuvre de fonctionnalités impossibles ou peu commodes à obtenir via services publics séparés . par exemple, cd, break, continue, et exec ne peut pas être mis en œuvre à l'extérieur de la coque parce qu'ils manipulent directement le shell lui-même. L'histoire, getopts, tuer, ou pwd objets internes, entre d'autres, pourraient être mis en œuvre dans des services publics distincts, mais ils sont plus pratique à utiliser comme commande intégrée. Tous les builtins shell sont décrites dans les sections suivantes.
pendant l'exécution des commandes est essentiel, la plus grande partie de la puissance (et complexité) des shells est due à leurs langages de programmation intégrés. Comme tout langage de haut niveau, le shell fournit des variables, des flux contrôle des constructions, des citations et des fonctions.
Shells offrent des fonctionnalités conçues spécifiquement pour un usage interactif plutôt qu'à augmenter le langage de programmation. Ces fonctions interactives comprend le contrôle des tâches, l'édition en ligne de commande, l'historique des commandes et alias. Chacune de ces caractéristiques est décrite dans le présent manuel.
BASH gnu.org:
Bash est l'interpréteur de commandes pour GNU le système d'exploitation. Le nom est un acronyme pour le ‘Bourne-Again SHell’, un jeu de mots sur Stephen Bourne, l'auteur de l'ancêtre direct du Unix shell sh, qui est apparu dans la septième édition Bell Labs Version de recherche D'Unix.
Bash est largement compatible avec sh et intègre des fonctionnalités utiles à partir de la Korn shell ksh et csh shell. Il est destiné à être un mise en œuvre conforme de la partie IEEE POSIX Shell et Tools la spécification IEEE POSIX (norme IEEE 1003.1). Il propose améliorations fonctionnelles par rapport à sh pour l'interactivité et la programmation utiliser.
alors que le système D'exploitation GNU fournit d'autres shells, y compris un version de csh, Bash est le shell par défaut . Comme les autres logiciels GNU, Bash est assez portable. Il actuellement fonctionne sur presque toutes les versions de Unix et quelques autres systèmes d'exploitation - ports pris en charge indépendamment existe pour les plateformes MS-DOS, OS/2 et Windows.
D'autres réponses ont généralement souligné la différence entre Bash et une norme POSIX shell. Cependant, lorsqu'on écrit des scripts shell portables et qu'on utilise la syntaxe Bash, une liste de bashismes typiques et de solutions pures POSIX correspondantes est très pratique. Une telle liste a été compilée lorsque Ubuntu est passé de Bash à Dash comme shell système par défaut et peut être trouvée ici: https://wiki.ubuntu.com/DashAsBinSh
de plus, il y a un grand outil appelé checkbashismes qui vérifie les bashismes dans votre script et est pratique quand vous voulez vous assurer que votre script est portable.
/bin/sh
peut ou ne peut pas invoquer le même programme que /bin/bash
.
sh
supporte au moins les caractéristiques requises par POSIX (en supposant une mise en œuvre correcte). Il peut prendre en charge des extensions aussi bien.
bash
, le "Bourne Again Shell", implémente les fonctionnalités requises pour les extensions spécifiques à SH plus bash. L'ensemble des extensions est trop long de décrire ici, et cela varie selon les nouvelles versions. Les différences sont documentées dans le manuel de bash. Tapez info bash
et lisez la section" Bash Features "(section 6 dans la version actuelle), ou lisez documentation courante en ligne .
Bash ( bash) est l'un des nombreux Unix shells disponibles (mais les plus couramment utilisés). Bash signifie "Bourne Again SHell", et est un remplacement/amélioration de L'original Bourne shell ( sh ).
Shell script est le script en shell, alors que les scripts Bash script est spécifiquement pour Bash.
système D'exploitation Linux offre différents types de shell. Bien que les shells aient beaucoup de commandes en commun, chaque type a des caractéristiques uniques. Étudions différents types de coquillages principalement utilisés.
SH shell:
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 chez at&T's Bell Labs en 1977. Il comprend de nombreux outils de script.
shell Bash :
Bash shell signifie Bourne Again Shell. Bash shell est l'interpréteur de commandes par défaut dans la plupart des distributions linux et remplace Sh Shell (SH shell s'exécute également dans L'interpréteur de commandes Bash) . Bash Shell peut exécuter la grande majorité des scripts SH shell sans modification et fournir également la fonction d'édition en ligne de commandes.