web-dev-qa-db-fra.com

Quelle est la différence entre #! / Bin / sh et #! / Bin / bash?

si j'écris,

#!/bin/bash
echo "foo"

ou

#!/bin/sh
echo "foo"

les deux donne le même. J'ai vu des scripts commençant par #!/bin/sh ou #!/bin/bash. Y a-t-il une différence entre eux?

255
Rahul Virpara

bashet shsont deux shells différents. Fondamentalement, bashest shname__, 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.

Ceci dit, vous devez vous rendre compte que /bin/sh sur la plupart des systèmes constituera un lien symbolique et n'appellera pas shname__. Dans Ubuntu, /bin/sh était utilisé pour lier à bashname__, comportement typique sur les distributions Linux, mais a maintenant changé pour se lier en n autre shell appelé dash . J'utiliserais bashname__, car c'est à peu près la norme (ou du moins la plus courante, selon mon expérience). En fait, des problèmes surviennent lorsqu'un script bash utilise #!/bin/sh car le créateur de script suppose que le lien est vers bashalors que ce n'est pas obligatoire.

Pour plus d'informations, http://man.cx/sh , http://man.cx/bash .

222
reverendj1

Sous Linux et d’autres systèmes de type Unix, vous avez le choix entre plusieurs shells.

Shell est responsable non seulement du dessin de votre petite invite, mais également de l’interprétation de vos commandes, en particulier si vous insérez une logique compliquée, comme les pipes, les conditionnels, etc.

bash est le shell le plus couramment utilisé comme shell par défaut pour les utilisateurs de systèmes Linux. C'est un descendant spirituel d'autres coquillages utilisés tout au long de l'histoire d'Unix. Son nom, bash est l'abréviation de Bourne-Again Shell, un hommage au Bourne Shell qu'il a été conçu pour remplacer, bien qu'il incorpore également des fonctionnalités des shell C et Korn.

Il est exécuté ces jours-ci à partir de /bin/bash - tous les systèmes avec bash l'auront accessible ici.

Cependant, ce ne sont pas seulement les utilisateurs qui utilisent des coques. Les scripts (scripts shell) ont besoin de shells pour les interpréter. Lorsque vous exécutez un script Shell, votre système doit démarrer un processus Shell pour exécuter votre script.

Le problème, c’est que différents coquillages ont de minuscules incohérences entre eux et qu’il s’agit d’exécuter des scripts, ils peuvent poser un réel problème. bash possède un grand nombre de fonctionnalités de script qui sont uniques à bash, et non aux autres shells. C'est bien, si vous allez toujours utiliser bash pour exécuter ces scripts. D'autres shells peuvent essayer d'émuler bash ou adhérer au standard POSIX, que bash supporte plutôt bien (bien que ses propres extensions lui soient ajoutées).

Il est possible de spécifier en haut d'un script Shell le shell avec lequel il doit être exécuté à l'aide d'un Shebang. Un script peut spécifier #!/bin/bash sur la première ligne, ce qui signifie qu'il doit toujours être exécuté avec bash, plutôt qu'avec un autre shell.

/bin/sh est un exécutable représentant le shell système. En réalité, il est généralement implémenté sous la forme d'un lien symbolique pointant sur l'exécutable de n'importe quel shell, le shell système. Le shell système est en quelque sorte le shell par défaut que les scripts système doivent utiliser. Dans les distributions Linux, pendant longtemps, il s'agissait généralement d'un lien symbolique vers bash, à tel point qu'il est devenu en quelque sorte une convention de lier toujours/bin/sh à bash ou à un shell compatible bash. . Cependant, ces dernières années, Debian (et Ubuntu) ont décidé de faire passer le système Shell de bash à dash - un shell similaire - rompant avec une longue tradition Linux (bien que GNU) d'utilisation de bash pour/bin/sh. Dash est considéré comme un shell plus léger et beaucoup plus rapide, ce qui peut être bénéfique pour la vitesse de démarrage (et d’autres tâches nécessitant beaucoup de scripts Shell, comme les scripts d’installation de packages).

Dash est assez bien compatible avec bash, étant basé sur le même standard POSIX. Cependant, il n'implémente pas les extensions spécifiques à bash. Il existe des scripts qui utilisent #!/bin/sh (le système shell) comme Shebang, mais qui nécessitent des extensions spécifiques à bash. Ceci est actuellement considéré comme un bogue qui devrait être corrigé par Debian et Ubuntu, qui ont besoin que/bin/sh soit capable de fonctionner lorsqu'il est pointé sur un tiret.

Même si Ubuntu shell système pointe vers un tiret, votre login Shell en tant qu'utilisateur continue d'être bash pour le moment. En d’autres termes, lorsque vous vous connectez à un émulateur de terminal n’importe où dans Linux, votre shell de connexion est bash. La vitesse de fonctionnement n'est pas vraiment un problème lorsque le shell est utilisé de manière interactive et que les utilisateurs sont familiarisés avec bash (et peuvent avoir des personnalisations spécifiques à bash dans leur répertoire de base).

Ce que vous devriez utiliser pour écrire des scripts

Si votre script nécessite uniquement des fonctionnalités prises en charge par bash, utilisez #!/bin/bash.

Mais dans la mesure du possible, il serait bon de vous assurer que votre script est compatible POSIX et d’utiliser #!/bin/sh, qui devrait toujours, de manière tout à fait fiable, pointer sur le système Shell privilégié compatible POSIX dans toute installation.

75
thomasrutter

En plus des réponses précédentes, même si /bin/sh est un lien symbolique vers /bin/bash, #!/bin/sh n'est pas totalement équivalent à #!/bin/bash.

Depuis la page de manuel bash (1) :

"Si bash est appelé avec le nom sh, il essaie de reproduire le plus fidèlement possible le comportement au démarrage des versions historiques de sh, tout en se conformant également au standard POSIX."

Par exemple, la syntaxe spécifique à bash:

 exec  > >(tee logfile.txt)

donne une erreur dans un Shell commençant par #!/bin/sh, même avec le lien symbolique sh-> bash en place.

17
AnkiF

GNU Bash: #!/bin/bash; POSIX Shell: #!/bin/sh.

3