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

208

si j'écris,

#!/bin/bash
echo "foo"

ou

#!/bin/sh
echo "foo"

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

    
posée virpara 25.05.2012 - 05:59
la source

3 réponses

176

bash et sh sont deux shells différents. 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.

Cela dit, vous devriez réaliser que /bin/sh sur la plupart des systèmes sera un lien symbolique et n'invoquera pas sh . Dans Ubuntu, /bin/sh utilisait un lien vers bash , un comportement typique sur les distributions Linux, mais maintenant il a été remplacé par un lien vers 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 scripteur suppose que le lien vers bash n'est pas obligatoire.

Pour plus d’informations, lien , lien .

    
réponse donnée reverendj1 25.05.2012 - 06:08
la source
62

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

Le shell est chargé non seulement de dessiner votre petite invite, mais d’interpréter vos commandes, surtout si vous utilisez une logique compliquée telle que des tuyaux, des conditionnels, etc.

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

Il est lancé ces jours-ci depuis /bin/bash - tout système avec bash sera accessible ici.

Ce ne sont pas seulement les utilisateurs qui utilisent des shells. 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 est que les différents shells ont de petites incohérences entre eux et qu’il s’agit d’un problème réel lorsqu’il s’agit d’exécuter des scripts. bash possède de nombreuses fonctionnalités de script uniques à bash, et non à d'autres shells. C'est bien, si vous utilisez toujours bash pour exécuter ces scripts. D'autres shells peuvent essayer soit d'émuler bash, soit de respecter le standard POSIX, que bash supporte assez bien (bien qu'il ajoute ses propres extensions à).

Il est possible de spécifier en haut d'un script shell quel shell doit être exécuté avec un shebang. Un script peut spécifier #!/bin/bash sur la première ligne, ce qui signifie que le script 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 fait, il est généralement implémenté comme un lien symbolique pointant vers l'exécutable, quel que soit le shell du système. Le shell système est une sorte de 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 quelque peu habituel de toujours lier / bin / sh à bash ou à un shell compatible avec bash. . Cependant, au cours des deux dernières années, Debian (et Ubuntu) ont décidé de basculer le shell du système de bash vers dash - un exemple similaire. shell - rupture avec une longue tradition dans Linux (enfin, GNU) d’utiliser bash pour / bin / sh. Dash est considéré comme un shell plus léger, et beaucoup plus rapide, qui peut être bénéfique pour la vitesse de démarrage (et d’autres éléments nécessitant beaucoup de scripts shell, comme les scripts d’installation de paquets).

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 shell du système) comme leur 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 de / bin / sh pour pouvoir travailler quand ils sont dirigés vers un tiret.

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

Ce que vous devez utiliser pour rédiger des scripts

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

Mais si possible, assurez-vous que votre script est compatible avec POSIX et utilisez #!/bin/sh , qui devrait toujours, de manière fiable, pointer vers le shell système POSIX le plus adapté à une installation. / p>     

réponse donnée thomasrutter 25.05.2012 - 10:31
la source
15

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 .

À partir de la page de manuel bash (1) :

  

"Si bash est appelé avec le nom sh, il essaie d'imiter le démarrage   comportement des versions historiques de sh aussi étroitement que possible, tout en   conforme à la norme 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- & gt; bash en place.

    
réponse donnée AnkiF 14.01.2015 - 12:24
la source

Lire d'autres questions sur les étiquettes