web-dev-qa-db-fra.com

Différence entre sh et bash

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 faut-il savoir lors de la programmation dans bash et sh?

1139
Weiwei Yang

Quel est sh

sh (ou le langage de commande Shell) est un langage de programmation décrit par le standard POSIX . Il a de nombreuses implémentations (ksh88, dash, ...). bash peut également être considéré comme une implémentation de sh (voir ci-dessous).

Comme sh est une spécification, et non une implémentation, /bin/sh est un lien symbolique (ou un lien physique) menant à une implémentation réelle sur la plupart des systèmes POSIX.

Qu'est ce que bash

bash a commencé comme une implémentation compatible avec shbien qu'elle soit antérieure au standard POSIX de quelques années), mais avec le temps, elle a acquis de nombreuses extensions. Bon nombre de ces extensions peuvent modifier le comportement des scripts POSIX Shell valides. Par conséquent, bash n’est pas un shell POSIX valide. C'est plutôt un dialecte du langage POSIX Shell.

bash prend en charge un commutateur --posix, ce qui le rend plus compatible avec POSIX. Il essaie également d'imiter POSIX s'il est appelé en tant que sh.

sh = bash?

Pendant longtemps, /bin/sh désignait /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.

Certains exemples populaires de systèmes où /bin/sh ne pointe pas vers /bin/bash (et sur certains desquels /bin/bash peut même ne pas exister) sont les suivants:

  1. Les systèmes Debian et Ubuntu modernes, qui symlink sh à dash par défaut;
  2. --- (Busybox , qui est généralement exécuté pendant le démarrage du système Linux dans le cadre de initramfs. Il utilise l'implémentation ash Shell.
  3. BSD, et en général tous les systèmes non-Linux. OpenBSD utilise pdksh, un descendant de Korn Shell. La variable sh de FreeBSD est un descendant du shell UNIX Bourne original. Solaris a son propre sh qui pendant longtemps n’était pas conforme à POSIX; une implémentation gratuite est disponible à partir du projet Heirloom .

Comment savoir ce que /bin/sh pointe sur votre système?

La complication est que /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 le suivant:

% 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 pasfind pour prendre en charge le -samefile option, bien que recherche GN et recherche FreeBSD le supporte.

Ligne Shebang

En fin de compte, c'est à vous de décider lequel utiliser, en écrivant la ligne "Shebang".

Par exemple.

#!/bin/sh

utilisera sh (et quoi que ce soit qui pointe du doigt),

#!/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 normalisé
  • c'est beaucoup plus simple et facile à apprendre
  • il est portable sur tous les systèmes POSIX - même s’ils n’ont pas bash, ils doivent avoir sh

L'utilisation de bash présente également des avantages. Ses fonctionnalités rendent la programmation plus pratique et similaire à la programmation dans d'autres langages de programmation modernes. Celles-ci incluent des éléments tels que des variables locales et des tableaux. Plain sh est un langage de programmation très minimaliste.

1008
Roman Cheplyaka

sh: http://man.cx/sh
bash: http://man.cx/bash

TL; DR : bash est un sur-ensemble de sh avec une syntaxe plus élégante et plus de fonctionnalités. Il est prudent d'utiliser une ligne bash Shebang dans presque tous les cas, car elle est assez répandue sur les plates-formes modernes.

NB: dans certains environnements, sh est bash. Vérifiez sh --version.

119
Rein Henrichs

Cette question a souvent été nominée comme canonique pour les personnes qui essaient d’utiliser sh et qui s’étonnent qu’elle ne se comporte pas de la même manière que bash. Voici un bref aperçu des malentendus et des pièges courants.

Tout d’abord, vous devez comprendre à quoi vous attendre.

  • Si vous exécutez votre script avec sh scriptname, ou avec scriptname et que vous avez #!/bin/sh dans la ligne Shebang , vous devez vous attendre à un comportement POSIX sh.
  • Si vous exécutez votre script avec bash scriptname, ou avec scriptname et que vous 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 simplement le nom du script (éventuellement avec un chemin relatif ou complet) est généralement la solution à privilégier. En plus d'un Shebang correct, cela nécessite que le fichier de script dispose de l'autorisation d'exécution (chmod a+x scriptname).

Alors, en quoi diffèrent-ils réellement?

Le manuel de référence de Bash comporte une section qui tente d’énumérer les différences , mais certaines sources courantes de confusion incluent

  • [[ n'est pas disponible dans sh (uniquement [ qui est plus encombrant et limité).
  • sh n'a pas de tableaux.
  • Certains mots clés Bash tels que local, source, function et select ne sont pas transférables à sh. (Certaines implémentations sh prennent en charge, par exemple, local.)
  • Bash a de nombreuses extensions de syntaxe de style C comme $'string\nwith\tC\aescapes' et la boucle à trois arguments for((i=0;i<=3;i++)), += affectation incrémentielle, etc.
  • Bash supporte <<<'here strings'.
  • Bash a le développement de *.{png,jpg} et {0..12}.
  • ~ fait référence à $HOME uniquement dans Bash (et plus généralement ~username dans le répertoire de base de username).Ceci est dans POSIX, mais peut être absent de certaines implémentations antérieures à POSIX /bin/sh.
  • Bash a la substitution de processus avec <(cmd) et >(cmd).
  • Bash a des alias de réacheminement de style Csh comme &| pour 2>&1 | et &> pour > ... 2>&1
  • Bash prend en charge les coprocessus avec la redirection <>.
  • Bash propose un riche ensemble de paramètres étendus non standard tels que ${substring:1:2}, ${variable/pattern/replacement}, la conversion de casse, etc.
  • Bash a considérablement étendu les fonctionnalités d'arithmétique de Shell (bien que toujours pas de support en virgule flottante). Il existe une syntaxe obsolète $[expression] héritée qui doit toutefois être remplacée par la syntaxe POSIX arithmétique $((expression)). (Certaines implémentations antérieures à POSIX sh peuvent ne pas supporter cela, cependant.)
  • Beaucoup, beaucoup d'extensions uniquement Bash 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 pas le comportement du script.

Rappelez-vous, ceci est une liste abrégée. Reportez-vous au manuel de référence pour connaître le scoop complet et http://mywiki.wooledge.org/Bashism pour de nombreuses solutions de contournement; et/ou essayez http://shellcheck.net/ qui vous avertit de nombreuses fonctionnalités réservées à Bash.

Une erreur courante est d'avoir une ligne #!/bin/bash Shebang, mais en utilisant néanmoins quand même sh scriptname pour exécuter le script. Cela désactive fondamentalement 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 avertira pas lorsque vous essayez d'utiliser ces constructions lorsqu'il est appelé en tant que sh. Elle ne désactive pas complètement tout la fonctionnalité Bash uniquement, aussi, exécuter Bash en l'invoquant sous le nom sh n'est pas un bon moyen de vérifier si votre script est proprement portable à ash / dash /POSIX sh ou à des variantes comme Heirloom sh

61
tripleee

Poste de NIX.COM

Fonctionnalités de Shell

Le tableau ci-dessous répertorie la plupart des fonctionnalités qui, selon moi, vous inciteraient à choisir un shell plutôt qu'un autre. Il ne s'agit pas d'une liste définitive et n'inclut pas toutes les fonctionnalités possibles pour chaque shell possible. Une fonctionnalité est considérée comme appartenant à un shell uniquement si elle est 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 maintenant tcsh ou leur propre shell C amélioré (ils ne signifient pas toujours qu’ils envoient 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

Légende du tableau ci-dessus.

Y Feature peut être fait en utilisant ce shell.

N La fonctionnalité n'est pas présente dans le shell.

La fonctionnalité F ne peut être réalisée qu’en utilisant le mécanisme de la fonction shell.

L La bibliothèque readline doit être liée à l'environnement de ligne de commande pour activer cette fonctionnalité.

Notes sur le 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.
48
SriniV

Shell est une interface entre un utilisateur et un système d'exploitation permettant d'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.

sh (Bourne sh ell) est un interpréteur de ligne de commande Shell, pour les systèmes d'exploitation Unix/Unix-like. Il fournit des commandes intégrées. Dans le langage de script, l’interprète est désigné par #!/bin/sh. C’était l’un des plus largement supporté par d’autres obus comme bash (free/open), kash (pas libre).

Bash (B ourne un gain s enfer) est un remplacement de Shell pour le Bourne Shell. Bash est un sur-ensemble de sh. Bash soutient sh. POSIX est un ensemble de normes définissant le fonctionnement des systèmes compatibles POSIX. Bash n'est pas réellement un shell conforme à POSIX. Dans un langage de script, l’interprète est désigné par #!/bin/bash.

Analogie:

  • Shell est comme une interface ou des spécifications ou une API.
  • sh est une classe qui implémente l'interface Shell.
  • Bash est une sous-classe du sh.

enter image description here

37
Premraj

TERMINAL

  • programme (s) ouvrant une fenêtre
  • xterm, rxvt, konsole, kvt, gnome-terminal, nxterm et eterm.

Shell

  • Est un programme qui s'exécute dans le terminal
  • Shell est à la fois un interpréteur de commandes et un langage de programmation
  • Shell est simplement un processeur de macros qui exécute des commandes.
  • Processeur de macros signifie fonctionnalité où le texte et les symboles sont développés pour créer des expressions plus grandes.

SH vs. BASH

SH

  • (Coquille)
  • Est-ce qu'un shell spécifique
  • un interpréteur de commandes et un langage de programmation
  • Prédécesseur de BASH

BASH

  • (Shell Bourne-Again)
  • Est-ce qu'un shell spécifique
  • un interpréteur de commandes et un langage de programmation
  • A la fonctionnalité sh et plus
  • Successeur de SH
  • BASH est le shell par défaut

MATERIEL DE REFERENCE:

Shell gnu.org:

A sa base, un shell est simplement un processeur de macros qui exécute des commandes. Le terme macro-processeur désigne une fonctionnalité dans laquelle le texte et les symboles sont développés pour créer des expressions plus grandes.

Un shell Unix est à la fois un interpréteur de commandes et un langage de programmation. En tant qu'interpréteur de commandes, le shell fournit l'interface utilisateur au riche ensemble de GNU utilitaires. Les fonctionnalités du langage de programmation permettent de combiner ces utilitaires. Les fichiers contenant des commandes peuvent être créés et deviennent des commandes elles-mêmes. Ces nouvelles commandes ont le même statut que les commandes système dans des répertoires tels que/bin, ce qui permet aux utilisateurs ou aux groupes d'établir des environnements personnalisés pour automatiser leurs tâches courantes.

Les coques peuvent être utilisées de manière interactive ou non interactive. En mode interactif, ils acceptent les entrées saisies au clavier. Lors de l'exécution non interactive, les shells exécutent les commandes lues dans un fichier.

Un shell permet l'exécution des commandes GNU, de manière synchrone et asynchrone. Le shell attend la fin des commandes synchrones avant d'accepter d'autres entrées; Les commandes asynchrones continuent de s'exécuter en parallèle avec le shell pendant la lecture et l'exécution de commandes supplémentaires. Les structures de redirection permettent un contrôle fin de l’entrée et de la sortie de ces commandes. De plus, le shell permet de contrôler le contenu des environnements de commandes.

Les shells fournissent également un petit ensemble de commandes intégrées implémentant des fonctionnalités impossibles ou incommodes à obtenir via des utilitaires séparés . Par exemple, cd, break, continue et exec ne peuvent pas être implémentés en dehors du shell car ils manipulent directement le shell lui-même. Les commandes intégrées history, getopts, kill ou pwd, entre autres, peuvent être implémentées dans des utilitaires distincts, mais leur utilisation est plus pratique comme commandes intégrées. Toutes les fonctions intégrées Shell sont décrites dans les sections suivantes.

Bien que l'exécution de commandes soit essentielle, l'essentiel de la puissance (et de la complexité) des shells est dû à leurs langages de programmation intégrés. Comme tout langage de haut niveau, le Shell fournit des variables, des constructions de contrôle de flux, des citations et des fonctions.

Les coques offrent des fonctionnalités spécialement conçues pour une utilisation interactive plutôt que pour augmenter le langage de programmation. Ces fonctions interactives incluent le contrôle des tâches, l'édition en ligne de commande, l'historique des commandes et les alias. Chacune de ces fonctionnalités est décrite dans ce manuel.

BASHgnu.org:

Bash est le shell ou l'interpréteur de langage de commande du système d'exploitation GNU. Le nom est un acronyme pour "Bourne-Again Shell", un jeu de mots inspiré de Stephen Bourne, auteur de l’ancêtre direct de l’actuel shell Unix, qui figurait dans la version Unix de la septième édition de Bell Labs Research.

Bash est largement compatible avec sh et intègre des fonctionnalités utiles de Korn Shell ksh et C Shell csh. Il s'agit d'une implémentation conforme de la partie IEEE POSIX Shell et outils de la spécification IEEE POSIX (norme IEEE 1003.1). Il offre des améliorations fonctionnelles par rapport à sh pour l’utilisation interactive et la programmation.

Alors que le système d'exploitation GNU fournit d'autres shells, y compris une version de csh, Bash est le shell par défaut . Comme les autres logiciels GNU, Bash est assez portable. Il fonctionne actuellement sur presque toutes les versions d'Unix et quelques autres systèmes d'exploitation. Il existe des ports pris en charge indépendamment pour les plates-formes MS-DOS, OS/2 et Windows.

22

D'autres réponses ont généralement souligné la différence entre Bash et un standard POSIX Shell. Cependant, lorsque vous écrivez des scripts Shell portables et que vous utilisez la syntaxe Bash, une liste de bashismes typiques et des solutions POSIX pures correspondantes est très pratique. Cette liste a été compilée lorsque Ubuntu est passé de Bash à Dash en tant que système shell par défaut et se trouve 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.

14
Andrzej Pronobis

/bin/sh peut invoquer ou non le même programme que /bin/bash.

sh supporte au moins les fonctionnalités requis 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 en fonction des nouvelles versions. Les différences sont documentées dans le manuel bash. Tapez info bash et lisez la section "Fonctionnalités Bash" (section 6 de la version actuelle) ou lisez le documentation en ligne actuelle .

3
Keith Thompson

bash et sh sont deux coquilles différentes. En gros, bash est sh, avec plus de fonctionnalités et une meilleure syntaxe. La plupart des commandes fonctionnent de la même manière, 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 remplace/améliore le Bourne Shell d'origine (sh).

Les scripts shell sont des scripts dans n'importe quel shell, alors que les scripts Bash sont spécifiquement conçus pour Bash. Dans la pratique, cependant, "script Shell" et "script bash" sont souvent utilisés de manière interchangeable, à moins que le shell en question ne soit pas Bash.

Ceci dit, vous devez réaliser que/bin/sh sur la plupart des systèmes constituera un lien symbolique et qu’il n’invoquera pas sh. Dans Ubuntu/bin/sh utilisait la liaison avec bash, comportement typique des 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 car le créateur du script suppose que le lien est dirigé vers bash lorsqu'il n'est pas nécessaire de l'être.

1
Gopika BG