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 ?

939
demandé sur Jianxin Gao 2011-04-20 07:33:16

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:

  1. les systèmes modernes Debian et Ubuntu, qui sont synlink sh à dash par défaut;
  2. 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 shell ash .
  3. BSDs, et en général toute systèmes non-Linux. OpenBSD utilise pdksh , un descendant de la coquille de Korn. Le sh de FreeBSD est un descendant du shell original D'UNIX Bourne. Solaris dispose de son propre sh 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 avoir sh

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.

878
répondu Roman Cheplyaka 2017-04-20 07:53:25

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 .

92
répondu Rein Henrichs 2018-03-09 14:00:32

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éristique

N 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.
42
répondu SriniV 2016-12-09 08:17:20

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 avec scriptname et avez #!/bin/sh dans le shebang Ligne , vous devez vous attendre à un comportement POSIX sh .
  • si vous exécutez votre script avec bash scriptname , ou l'exécutez avec scriptname 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 dans sh ( [ qui est plus maladroit et limitée).
  • sh n'a pas de tableaux.
  • certains mots clés Bash comme local , function , et select ne sont pas portables à sh .
  • Bash a de nombreuses extensions de syntaxe de style C comme $'string\nwith\tC\aescapes' et les trois arguments for((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 de username ).
  • 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 .

33
répondu tripleee 2018-06-30 21:18:54

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.

enter image description here

23
répondu Premraj 2018-09-06 02:04:27

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 Shells

fournissent é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.

20
répondu Timothy L.J. Stewart 2016-09-03 18:53:36

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.

14
répondu Andrzej Pronobis 2015-05-18 02:22:23

/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 .

3
répondu Keith Thompson 2015-04-09 16:01:09

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.

2
répondu Srinivasulu Chinna 2018-07-23 16:37:48

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.

0
répondu rashedcs 2018-06-25 13:37:01