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


211
2018-05-25 03:59


origine




Réponses:


bash et sh sont deux coquilles différentes. Fondamentalement 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 /bin/sh sur la plupart des systèmes sera un lien symbolique et ne sera pas invoquer sh. Dans Ubuntu /bin/sh utilisé pour lier à bash, comportement typique sur les distributions Linux, mais a maintenant changé pour lier à une autre coquille appelée tiret. 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 quand un script bash utilisera #!/bin/sh parce que le scénariste suppose que le lien est à bash quand ça ne doit pas être.

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


178
2018-05-25 04:08



Votre premier paragraphe est trompeur. "sh" n'est pas du tout un shell, mais un lien symbolique vers le fichier actuellement configuré shell système, qui sur les systèmes Linux est généralement bash ou dash (versions récentes d'Ubuntu utilisant ce dernier). - thomasrutter
/bin/sh l'habitude d'être un shell appelé bourne coquille en 1977. bash est un shell compatible avec / bin / sh pouvez être utilisé comme un remplacement de shell Bourne conforme à Posix. en.wikipedia.org/wiki/Bourne_shell - Alex
frapper est un standard de facto (très largement utilisé) mais ce n'est pas "standard"; sh sur les utilisations d'Ubuntu tiret, qui est un shell compatible avec Posix, donc il est vraiment standard. Mon conseil est d'utiliser tiret aussi souvent que possible pour les scripts, en particulier pour les scripts côté serveur. Bien que frapperest plus expressif, tiret fonctionne beaucoup plus rapidement et est plus sécurisé. - Rick-777
@ Rick-777 Alors devrais-je explicitement mettre #! / Bin / dash en haut de mes scripts? J'ai aussi écrit des scripts où je n'écris que des commandes et exécute avec ./scriptName et cela a bien fonctionné. Est-ce que le #! / Bin / yourShellHere est nécessaire? - user137717
@ Rick-777 Dans les cas où j'exclut un #! / Bin / shellName, j'ai nommé les fichiers NomFichier.sh. Est-ce que cela sera implicitement lié au shell du système préféré sans déclarer #! / Bin / sh? - user137717


Sur Linux et les 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 les tuyaux, les conditionnels, etc.

frapper est le shell le plus utilisé comme shell 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, frapper est une abréviation de Bourne-Again Shell, un hommage à la coque Bourne qu’elle était destinée à remplacer, bien qu’elle intègre également des fonctionnalités de la coque C et de la coque Korn.

C'est couru, de nos jours, de /bin/bash - tout système avec bash l’aura accessible ici.

Ce ne sont pas seulement les utilisateurs qui utilisent des shells. Scripts (scripts shell) ont besoin de coquilles 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. frapper a beaucoup de fonctionnalités de script qui sont uniques uniquement à bash, et pas à 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 d'adhérer au 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é en utilisant 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, il s’agissait depuis longtemps d’un lien symbolique vers frapper, à tel point qu'il est devenu quelque peu conventionnel 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 changer le shell du système de bash à tiret - un shell similaire à 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, tels que 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 pointés vers un tiret.

Même si Ubuntu shell système pointe vers le tableau de bord, votre shell de connexion en tant qu'utilisateur continue d'être bash à ce moment. 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 écrire des scripts

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

Mais si possible, il serait bon de s’assurer que votre script est compatible avec POSIX et utiliser #!/bin/sh, qui devrait toujours, de manière assez fiable, pointer sur le shell système POSIX préféré dans toute installation.


62
2018-05-25 08:31





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.

Du 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-> bash en place.


15
2018-01-14 11:24