Je vois deux types de code utilisés:
#!/usr/bin/sh
et:
#!/user/bin/bash
J'ai cherché ceci en ligne et les opinions varient beaucoup. Les explications que j'ai vues sur la plupart des sites Web disent que sh
c'est plus ancien que bash
, et qu'il n'y a pas de réelle différence.
Est-ce que quelqu'un connaît la différence entre ces derniers? Pouvez-vous me donner un exemple pratique quand utiliser l'un sur l'autre?
sh
etbash
): http://en.wikipedia.org/wiki/Comparison_of_command_shellsRéponses:
bash
est un surensemble desh
ie. tout ce que vous pouvez faire,sh
vous pouvez le fairebash
.Bash a plus de fonctionnalités (branchement, builtins, tableaux) facilitant l'écriture du script. Certains * nix'es plus tard ont
/bin/sh
un lien vers/bin/bash
Pour une explication complète de ce qui est ici un tutoriel
la source
sh
) n'a pas été simplement étendu est que Bash` a été écrit par quelqu'un d'autre. Je parie également qu'il y avait des problèmes de licence. Lire l'article sur le Bourne Shell en.wikipedia.org/wiki/Bourne_shellsh
casserait beaucoup de scripts qui s'attendent à ce qu'elle soit là et dépendent de la façon dont elle analyse les choses. Les utilisateurs de Linux peuvent ne pas s'en soucier, mais les gens qui dépensent des milliers de dollars sur Solaris, AIX ou HP-UX peuvent être très ennuyés.sh
n'a pas été simplement étendu: son code source est un enfer pur. Regarde. C'est censé être C ...Traditionnellement, / bin / sh aurait été le shell Bourne d'origine, qui n'a pas d'historique ni de modification en ligne de commande, et aucun contrôle de tâche.
Depuis environ 15 ans environ, la plupart des Unix ont eu le shell POSIX installé, ou au moins ksh ou bash (qui sont très similaires à POSIX), mais ont toujours le shell plus limité dans / bin / sh
La raison en est que les anciens scripts shell qui attendent l'ancienne
sh
commande continueront de fonctionner.Depuis des personnages comme
{
,}
et!
ont une signification particulière pour bash, il est possible qu'un script shell plus en utilisant les caractères (sans les échapper) pourrait échouer.(Le shell Bourne prendrait
!!{1,2}
littéralement, tandis que bash interpréterait cela comme une répétition de la commande précédente (!!
) suivie d'une extension d'accolade).Sur Linux cependant, la
sh
commande est presque toujours juste un lien versbash
, avec toutes les mêmes fonctionnalités.la source
sh peut signifier Bourne shell ou / bin / sh, qui est un autre shell (conforme POSIX) sur la plupart des plates-formes modernes. "Le shell POSIX" est le shell abstrait défini par POSIX , qui est implémenté par bash en mode POSIX, ou ksh ou dash par défaut. / bin / sh est parfois également appelé shell POSIX, car il s'agit d'un shell conforme à POSIX sur la plupart des plates-formes. Les coquilles Bourne d'origine ne sont pas des coquilles POSIX.
bashref a une liste de différences entre les coquilles bash et Bourne .
man bash
a une liste de modifications lorsque bash est appelé en mode POSIX ./ bin / sh n'est pas un lien symbolique ou un lien dur sous OS X, mais c'est presque la même taille que / bin / bash:
homme bash :
L'imitation des coquilles Bourne est par ailleurs assez limitée.
bash +B
(Bourne) désactiverait en fait des fonctionnalités telles que l'expansion de l'accolade.Mais même si vous désactivez le mode POSIX, l'écho se comporte comme
echo -e
par défaut:/ bin / sh est un tiret sur Ubuntu , donc certains bashismes fonctionnent avec / bin / sh sur OS X mais pas Ubuntu.
Si vous voulez réellement écrire des scripts pour (quelque chose comme) les shells Bourne d'origine, vous pouvez utiliser à la
#!/usr/bin/env bash +B
place.Je pense qu'il est plus facile d'écrire des scripts pour bash que d'éviter des fonctionnalités qui ne font pas partie des spécifications POSIX ou des shells Bourne ou de tout tester avec d'autres shells.
la source
En fait, même si / bin / sh peut être un lien vers / bin / bash, s'il est démarré comme sh, il se comporte différemment. Depuis la page de manuel bash:
Ainsi
sh
, il essaie d'imiter le comportement historique de sh. En tant quebash
, il essaie d'être aussi utile que possible comme un shell de connexion interactif.la source
Sur de nombreux systèmes et sur Solaris en particulier, bash est lié dynamiquement tandis que sh est lié statiquement. Cela peut constituer une menace pour la sécurité, pour cette raison, l'utilisateur root ne doit utiliser que / bin / sh comme shell (si vous devez vous connecter en tant que root).
la source
ldconfig
ou si votre/lib
répertoire est effacé pour une raison quelconque.