6 votes

Quelle est la différence réelle entre sh et bash?

Basé sur ce que j'ai lu en ligne, sh est essentiellement un alias pour bash; exécuter un script shell avec sh se comportera de la même manière que s'il était exécuté avec bash.

Dans mon expérience, ce n'est pas tout à fait vrai, car les sauts de ligne sont traités différemment. Quelle est exactement la différence entre sh et bash, et comme zsh est maintenant le shell par défaut, est-ce que quelqu'un sait si sh changera dans les futures versions de Mac OS ?

Considérez le code suivant :

sh -c "echo \"Hello\nWorld\""

Cela devrait produire la sortie suivante :

Hello
World

Cependant, lorsqu'il est exécuté avec bash :

bash -c "echo \"Hello\nWorld\""

Le saut de ligne n'est pas affiché :

Hello\nWorld

Merci d'avance !

0 votes

@user3439894 Sous BigSur, /bin/sh est juste un wrapper qui exécute le shell /var/select/sh pointe vers (qui, dans mon cas, est bash), voir man sh pour plus de détails.

0 votes

Il se peut que ce soit déjà le cas pour Catalina, exécutez strings /bin/sh pour vérifier.

4voto

nohillside Points 82672

La réponse détaillée à ce sujet a déjà été écrite, voir https://stackoverflow.com/questions/5725296/difference-between-sh-and-bash.

La commande echo est l'une (parmi plusieurs) des choses où sh et bash diffèrent. Pour obtenir que bash interprète \n comme un caractère de contrôle, utilisez echo -e.

$ bash -c "echo -e \"Bonjour\nMonde\""
Bonjour
Monde

Concernant la définition de sh sur macOS, voir man sh (par exemple sur Big Sur) :

sh est un interpréteur de commandes (shell) conforme à POSIX. Il est implémenté en se ré-exécutant soit en tant que bash(1), dash(1) ou zsh(1) tel que déterminé par le lien symbolique situé à /private/var/select/sh. Si /private/var/select/sh n'existe pas ou ne pointe pas vers un shell valide, sh utilisera l'un des shells supportés.

Donc en exécutant sh, cela exécutera le shell vers lequel /private/var/select/sh pointe en "mode de compatibilité sh/POSIX".

0 votes

Merci beaucoup. Cela m'a certainement donné quelques éclaircissements, mais /private/var/select/sh ne semble pas exister pour moi. sh --version affiche GNU bash, donc il doit être lié à bash. Ce que je voudrais, c'est une façon pour mes scripts shell actuels, sans modification, de s'exécuter via bash et de se comporter comme ils le font avec sh. J'ai essayé l'argument --posix mais cela ne change rien. La raison pour laquelle je veux faire cela est qu'il semble que sh puisse être fondamentalement différent d'une machine à l'autre. Peut-être que ce que je veux réaliser n'est pas possible sans modifier mes scripts.

0 votes

@BenCheshire sh doit se comporter de la même manière pour tous les systèmes conformes à POSIX/la norme Unix. Donc tant que vous utilisez #!/bin/sh le script devrait fonctionner sur tous les systèmes Unix. Peu importe que /bin/sh soit un binaire à part entière ou simplement lié à bash, zsh, etc. L'exécution de l'un ou l'autre en tant que sh garantira la compatibilité sh et désactivera toutes les fonctions spécifiques à un shell.

0 votes

Intéressant. Cela devrait me faire gagner beaucoup d'ennuis. Merci!

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X