Question 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?

De quoi devons-nous être conscients lorsque nous programmons bash et sh?


901
2018-04-20 03:33


origine


Réponses:


Qu'est-ce que sh

sh (ou le Shell Command Language) est un langage de programmation décrit par le POSIX la norme. Il a de nombreuses implémentations (ksh88, dash, ...). bash peut également être considéré comme une mise en œuvre de sh (voir ci-dessous).

Car sh est une spécification, pas une implémentation, /bin/sh est un lien symbolique (ou un lien dur) à une implémentation réelle sur la plupart des systèmes POSIX.

Qu'est-ce que bash

bash commencé comme un shimplémentation compatible (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 shell POSIX valides, donc par lui-même bash n'est pas un shell POSIX valide. Il s'agit plutôt d'un dialecte du langage shell POSIX.

bash soutient un --posix switch, ce qui le rend plus compatible POSIX. Il essaie également d'imiter POSIX si invoqué comme sh.

sh = bash?

Pendant longtemps, /bin/sh utilisé pour pointer sur /bin/bash sur la plupart des systèmes GNU / Linux. En conséquence, il était presque sûr d'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 vers /bin/bash (et sur certains d'entre eux /bin/bash peut même pas exister) sont:

  1. Systèmes modernes Debian et Ubuntu, quel lien symbolique 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 le ash implémentation de shell.
  3. BSD, et en général tous les systèmes non-Linux. OpenBSD utilise pdksh, un descendant du shell Korn. FreeBSD sh est un descendant du shell UNIX Bourne original. Solaris a son propre sh qui, pendant longtemps, n'était pas conforme à POSIX; une mise en œuvre gratuite est disponible à partir du Projet Heirloom.

Comment pouvez-vous 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. Si c'est un lien symbolique, un portable façon de le résoudre est:

% file -h /bin/sh
/bin/sh: symbolic link to bash

Si c'est un lien difficile, essayez

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

En fait, le -L Le drapeau couvre à la fois les liens symboliques et les liens physiques, mais l'inconvénient de cette méthode est qu'elle n'est pas portable - POSIX ne nécessite pas  find pour soutenir le -samefile option, bien que les deux GNU trouver et Trouver FreeBSD soutiens le.

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 vers),

#!/bin/bash

utilisera /bin/bash si c'est disponible (et échouer avec un message d'erreur si ce n'est pas le cas). Bien sûr, vous pouvez également spécifier une autre implémentation, par ex.

#!/bin/dash

Lequel utiliser

Pour mes propres scripts, je préfère sh Pour les raisons suivantes:

  • c'est standardisé
  • c'est beaucoup plus simple et plus facile à apprendre
  • il est portable sur tous les systèmes POSIX - même s'ils n'ont pas bash, ils sont tenus d'avoir sh

Il y a des avantages à utiliser bash ainsi que. Ses caractéristiques rendent la programmation plus pratique et similaire à la programmation dans d'autres langages de programmation modernes. Cela inclut des choses comme les variables locales et les tableaux. Plaine sh est un langage de programmation très minimaliste.


855
2018-04-20 04:10



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

TL; DR: bash est un surensemble de sh 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 il est assez omniprésent sur les plates-formes modernes.

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


85
2018-04-20 03:43



Message de UNIX.COM

Caractéristiques de Shell

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 n'inclut pas toutes les fonctionnalités possibles pour chaque shell possible. Une fonctionnalité est considérée comme étant dans un shell uniquement si elle est fournie avec le système d'exploitation ou si elle est disponible directement depuis 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 soit tcsh soit leur propre shell C amélioré (ils ne rendent pas toujours évident qu'ils expédient 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

Clé de la table ci-dessus.

La caractéristique Y peut être faite en utilisant ce shell.

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

F La fonction ne peut être effectuée qu'en utilisant la fonction shells           mécanisme.

L La bibliothèque readline doit être liée dans le shell pour permettre           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
2017-08-04 06:10



Cette question a souvent été nommée canonique pour les personnes qui essaient d'utiliser sh et sont surpris qu'il ne se comporte pas comme bash. Voici un aperçu rapide des malentendus et des pièges courants.

Tout d'abord, vous devez comprendre à quoi s'attendre.

  • Si vous exécutez votre script avec sh scriptnameou exécutez-le avec scriptname et avoir #!/bin/sh dans le case ligne, vous devriez vous attendre POSIX sh comportement.
  • Si vous exécutez votre script avec bash scriptnameou exécutez-le avec scriptname et avoir #!/bin/bash (ou l'équivalent local) dans la ligne shebang, vous devriez 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 une autorisation d'exécution (chmod a+x scriptname).

Alors, comment sont-ils réellement différents?

Le manuel de référence de Bash a un section qui tente d'énumérer les différences mais certaines sources communes de confusion comprennent

  • [[n'est pas disponible en sh (seulement [ ce qui est plus maladroit et limité).
  • sh n'a pas de tableaux.
  • Quelques 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, += incrémentation, etc.
  • Supports de Bash <<<'here strings'.
  • Bash a *.{png,jpg} et {0..9} Accroître l'expansion.
  • ~ fait référence à $HOME seulement dans Bash (et plus généralement ~username au répertoire personnel de username).
  • Bash a une substitution de processus avec <(cmd) et >(cmd).
  • Bash supporte les coprocessus avec <> redirection
  • Bash a considérablement étendu les possibilités d'arithmétique de shell (mais toujours pas de support à virgule flottante) et de manipulation de sous-chaîne variable avec ${substring:1:2}, ${variable/pattern/replacement}, conversion de cas, etc.
  • Beaucoup, beaucoup d'extensions Bash seulement pour activer ou désactiver le comportement optionnel et exposer l'état interne du shell.
  • Beaucoup, beaucoup de fonctionnalités pratiques pour l'utilisation interactive qui n'affectent cependant pas le comportement du script.

Rappelez-vous, ceci est une liste abrégée. Reportez-vous au manuel de référence pour le scoop complet, et http://mywiki.wooledge.org/Bashism pour beaucoup de bonnes solutions de contournement; et / ou essayer http://shellcheck.net/ qui prévient de nombreuses fonctionnalités de Bash uniquement.

Une erreur commune est d'avoir un #!/bin/bash ligne de shebang, mais en utilisant néanmoins sh scriptname pour exécuter le script. Cela désactive fondamentalement toute fonctionnalité Bash uniquement, de sorte que vous obtenez des erreurs de syntaxe, par exemple. pour essayer d'utiliser des tableaux.

Malheureusement, Bash ne vous avertira pas lorsque vous essayez d'utiliser ces constructions lorsqu'il est appelé sh. Il ne désactive pas complètement tout Fonctionnalité Bash uniquement, donc en exécutant Bash en l'invoquant comme sh n'est pas un bon moyen de vérifier si votre script est correctement ash/dash/ POSIX sh.


32
2018-03-08 08:44



coquille est une interface entre un utilisateur et un 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 de ligne de commande).

sh (Bourne shell) est un interpréteur de ligne de commande shell, pour les systèmes d'exploitation de type Unix / Unix. Il fournit des commandes intégrées. Dans le langage de script, nous désignons l'interprète comme #!/bin/sh. Il était le plus largement soutenu par d'autres coquilles comme bash (libre / ouvert), kash (pas libre).

Frapper (BOurne uneGain sl'enfer) est un remplacement de la coquille pour le shell Bourne. Bash est le surensemble 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 compatible POSIX. Dans un langage de script, nous désignons l'interpréteur comme #!/bin/bash.

Analogie: 

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

21
2018-02-09 09:46



TERMINAL 

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

COQUILLE

  • Est-ce 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 macro-processeur qui exécute des commandes.
  • Macro processeur signifie une fonctionnalité où le texte et les symboles sont développés pour créer des expressions plus grandes.

Vs SH FRAPPER

SH

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

FRAPPER

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

MATÉRIEL DE RÉFÉRENCE:

COQUILLE gnu.org:

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

Un Unix shell est à la fois un interpréteur de commandes et un langage de programmation.   En tant qu'interprète de commande, le shell fournit l'interface utilisateur à   riche ensemble d'utilitaires GNU. Les fonctionnalités du langage de programmation permettent   ces utilitaires à combiner. Les fichiers contenant des commandes peuvent être   créé, et deviennent des commandes elles-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 d'établir des environnements personnalisés pour automatiser leur   Tâches communes.

Les coquilles peuvent être utilisées de manière interactive ou non interactive. En interactif   mode, ils acceptent l'entrée tapée du clavier. Lors de l'exécution   De manière non interactive, 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 que les commandes synchrones soient terminées   avant d'accepter plus d'entrée; commandes asynchrones continuent à exécuter   en parallèle avec le shell pendant qu'il lit et exécute des   commandes. Les constructions de redirection permettent un contrôle précis de   l'entrée et la sortie de ces commandes. De plus, la coque permet   contrôle sur le contenu des environnements de commandes.

Les shells fournissent également un petit ensemble de commandes intégrées (builtins)   implémentation d'une fonctionnalité impossible ou incommode à obtenir via   utilitaires séparés. Par exemple, cd, break, continue et exec ne peuvent pas   être mis en œuvre en dehors de la coquille parce qu'ils manipulent directement   la coquille elle-même. L'histoire, getopts, kill, ou pwd builtins, parmi   d'autres, pourraient être mis en œuvre dans des services publics distincts, mais ils sont plus   pratique à utiliser comme commandes intégrées. Tous les builtins shell sont   décrit dans les sections suivantes.

Alors que l'exécution de commandes est essentielle, la plupart du pouvoir (et   complexité) des shells est due à leurs langages de programmation embarqués.   Comme tout langage de haut niveau, le shell fournit des variables, des flux   Construire des contrôles, des citations et des fonctions.

Les shells offrent des fonctionnalités spécialement conçues pour un usage interactif   que d'augmenter le langage de programmation. Ces fonctionnalités interactives   inclure le contrôle des tâches, l'édition de la ligne de commande, l'historique des commandes et   alias Chacune de ces fonctionnalités est décrite dans ce manuel.

FRAPPER  gnu.org:

Bash est le shell, ou l'interpréteur de langage de commande, pour le GNU   système opérateur. Le nom est l'acronyme de 'Bourne-Again SHell',   un jeu de mots sur Stephen Bourne, l'auteur de l'ancêtre direct de la   shell Unix actuel, 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 du shell Korn Ksh et du shell C Csh. Il est destiné à être un   implémentation conforme de la partie IEEE POSIX Shell et Tools de   la spécification IEEE POSIX (norme IEEE 1003.1). CA offre   améliorations fonctionnelles sur sh pour l'interactif et la programmation   utilisation.

Alors que le système d'exploitation GNU fournit d'autres coquilles, y compris un   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 de   Unix et quelques autres systèmes d'exploitation - ports indépendants   existe pour les plates-formes MS-DOS, OS / 2 et Windows.


20
2017-09-03 12:51



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 quand Ubuntu est passé de Bash à Dash comme shell système par défaut et peut être trouvé ici: https://wiki.ubuntu.com/DashAsBinSh

De plus, il y a un excellent outil appelé checkbashismes qui vérifie les bashismes dans votre script et est utile lorsque vous voulez vous assurer que votre script est portable.


14
2018-05-18 02:22