Si j'écris,
#!/bin/bash
echo "foo"
または
#!/bin/sh
echo "foo"
les deux donnent le même résultat. J'ai vu des scripts commençant par #!/bin/sh
o #!/bin/bash
. Y a-t-il une différence entre eux ?
Si j'écris,
#!/bin/bash
echo "foo"
または
#!/bin/sh
echo "foo"
les deux donnent le même résultat. J'ai vu des scripts commençant par #!/bin/sh
o #!/bin/bash
. Y a-t-il une différence entre eux ?
bash
y sh
sont deux coquilles différentes. En gros, bash
es 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 devez savoir /bin/sh
sur la plupart des systèmes sera un lien symbolique et n'invoquera pas sh
. Dans Ubuntu /bin/sh
utilisé pour établir un lien avec bash
, comportement typique des distributions Linux, mais qui a maintenant changé pour 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, les problèmes surviennent lorsqu'un script de bash utilisera #!/bin/sh
parce que le script-fabricant suppose que le lien est pour bash
quand ça n'a pas à l'être.
Pour plus d'informations, http://man.cx/sh , http://man.cx/bash .
Sous Linux et d'autres systèmes de type Unix, vous avez le choix entre plusieurs shells.
Le Shell est responsable non seulement de dessiner votre petit prompt, mais aussi d'interpréter vos commandes, surtout si vous y mettez une logique compliquée comme des pipes, des conditionnels et ainsi de suite.
bash est le Shell le plus courant utilisé comme Shell par défaut pour les utilisateurs de systèmes Linux. C'est un descendant spirituel d'autres shells utilisés tout au long de l'histoire d'Unix. Son nom, bash est une 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 du C Shell et du Korn Shell.
Il est dirigé, ces jours-ci, par /bin/bash
- tout système avec bash l'aura accessible ici.
Mais les utilisateurs ne sont pas les seuls à utiliser les shells. scripts ( Shell Shell ) ont besoin de coquilles pour les interpréter. Lorsque vous exécutez un Shell Shell, votre système doit démarrer un processus Shell pour exécuter votre Shell.
Le problème est que les différents shells ont de toutes petites incohérences entre eux, et quand il s'agit d'exécuter des scripts, ceux-ci peuvent être un vrai problème. bash possède un grand nombre de fonctionnalités de script qui sont uniques à bash, et non à d'autres shells. C'est bien, si vous allez toujours utiliser bash pour exécuter ces scripts. Les autres shells peuvent essayer soit d'émuler bash, soit d'adhérer au standard POSIX, que bash supporte assez bien (bien qu'il y ajoute ses propres extensions).
Il est possible de spécifier en haut d'un Shell Shell avec quel Shell il doit être exécuté en utilisant un shebang. Un Shell 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 script.
/bin/sh est un exécutable représentant le système Shell . En fait, il est généralement implémenté comme un lien symbolique pointant vers l'exécutable pour n'importe quel Shell qui est le Shell système. Le Shell système est en quelque sorte le Shell par défaut que les Shell système doivent utiliser. Dans les distributions Linux, pendant longtemps, c'était généralement un lien symbolique vers bash Il est donc devenu une sorte de convention de toujours lier /bin/sh à bash ou à un Shell compatible avec bash. Cependant, au cours des deux dernières années, Debian (et Ubuntu) a décidé de changer le système Shell de bash à tableau de bord - un Shell similaire - rompant 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, ce qui peut être bénéfique pour la vitesse de démarrage (et d'autres choses qui nécessitent beaucoup de Shell Shell, comme les Shell 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 y a des scripts existants qui utilisent #!/bin/sh
(le système Shell) comme leur shebang, mais qui nécessitent des extensions spécifiques à la base. Ceci est actuellement considéré comme un bogue qui devrait être corrigé par Debian et Ubuntu, qui exigent que /bin/sh puisse fonctionner lorsqu'il est pointé vers dash.
Même si le programme Ubuntu système Shell pointe vers dash, votre login Shell en tant qu'utilisateur continue à être bash pour le moment. C'est-à-dire que lorsque vous vous connectez à un émulateur de terminal n'importe où dans Linux, votre Shell de connexion sera bash. La vitesse de fonctionnement n'est pas tellement un problème lorsque le Shell est utilisé de manière interactive, et que les utilisateurs sont familiers avec bash (et peuvent avoir des personnalisations spécifiques à bash dans leur répertoire personnel).
Ce que vous devez utiliser lorsque vous écrivez des scripts.
Si votre script nécessite des fonctionnalités uniquement supportées par bash, utilisez #!/bin/bash
.
Mais si possible, il serait bon de s'assurer que votre script est compatible avec POSIX, et d'utiliser #!/bin/sh
qui devrait toujours, de manière assez fiable, pointer vers le système compatible POSIX préféré Shell dans toute installation.
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
.
De la page de manuel de bash(1) :
"Si bash est invoqué avec le nom sh, il essaie d'imiter le plus fidèlement possible le comportement au démarrage des versions historiques de sh. des versions historiques de sh, tandis que tout en se conformant 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.
SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.