Pourquoi est-ce que j'obtiens des sorties différentes en cas de sh et bash?


8

J'ai le script simple suivant:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {1..99..2}
do
        echo $i
done

Sortie au cas où je courrais avec sh file.sh:

Bash version ...
{1..99..2}

Sortie au cas où je courrais avec bash file.sh:

Bash version 4.2.25(1)-release...
1
3
5
.
.
.
99

J'ai deux requêtes:

  1. Si j'ai écrit une ligne de shabang spécifiant le shell, ne devrait-elle pas fonctionner avec bash, que j'utilise sh file.shou bash file.sh?

  2. Je comprends que ce $BASH_VERSIONn'est pas reconnu par sh mais quel est le problème avec la boucle for? Pourquoi n'imprime-t-on pas les chiffres?

Réponses:


16

sh, le coquillage Bourne, est vieux . Son comportement est spécifié par la norme POSIX . Si vous voulez un nouveau comportement, vous utilisez bash, le shell Bourne Again, qui obtient tout le temps de nouvelles fonctionnalités. Sur de nombreux systèmes, shest juste bashet bashactive un mode de compatibilité lorsqu'il est exécuté sous ce nom. Sur Ubuntu, shc'est dashle shell Debian Almquist.

L'expansion de l'accolade est une fonctionnalité relativement nouvelle , et ne serait pas disponible dans les anciens bashes également. Cela ne devrait certainement pas être inclus sh.

La ligne shebang n'est respectée que si vous appelez le script en tant qu'exécutable:

./myscript.sh

Je peux donner un script à n'importe quel shebang et le garder ouvert en Python en exécutant:

python myscript.sh

Voir ces excellentes questions sur Unix et Linux:


5

SH est stupide. Il ne peut rien faire.

Il ne connaît que les commandes les plus élémentaires. Il ne fait rien d'autre.

Il ne peut pas comprendre {1..99} comme une valeur numérique. Il le comprend comme une chaîne.

SH / Dash n'est pas développé. Il est censé être une invite d'urgence pour les circonstances DIRE (en mode interactif. Sinon, c'est vraiment une bonne chose pour les scripts.).

Bash est recommandé car il peut faire tout ce que SH peut faire, ainsi que les dernières fonctionnalités de personnalisation et puissantes.

En réponse à # 1, le #!n'est analysé que si le programme est appelé directement. (comme dans, ./program.sh)


6
« Il est censé être une invite d'urgence pour les circonstances DIRE. » dash, Qui , comme vous le dites shdans Ubuntu, n'est pas présent principalement «pour être une invite d'urgence pour les circonstances DIRE», mais plutôt pour que le système puisse fonctionner et démarrer rapidement . De cette façon, il dashest bien adapté à une utilisation dans un système d' exploitation moderne, mais ce qu'il est bien adapté pour est un profil bas, shell rapide pour les scripts - en particulier, l' exécution de scripts système lors du démarrage d' un grand système d' exploitation complexe, moderne, avec un minimum frais généraux de performance.
Eliah Kagan

@EliahKagan Vous n'utilisez vraiment SH que si quelque chose est terriblement mauvais.
Kaz Wolfe

1
Vous l'utilisez shassez constamment, et particulièrement intensivement lors du démarrage d'Ubuntu. C'est principalement important pour ses utilisations de script automatisées, et c'est un cas d'utilisation très important dans Ubuntu. (Si vous supprimiez le /bin/shlien symbolique - de sorte qu'il n'y aurait en fait «aucun SH» - les choses iraient terriblement mal: Ubuntu ne pourrait pas démarrer dans un état utilisable.)
Eliah Kagan

@EliahKagan Quand avez-vous utilisé SH pour la dernière fois comme terminal préféré? Je sais que vous l'utilisez pour créer un script, mais quand l'utilisez-vous réellement en mode interactif?
Kaz Wolfe

2
Hier, pour vérifier la portabilité d'une commande. Mais votre argument selon lequel l'utilisation interactive du tableau de bord est rare est valable. (Et de toute façon, le contexte de mon utilisation interactive était toujours orienté script.) .... Mais "utilisation" ne signifie pas "utilisation interactive", et plus important encore, le cas d'utilisation de cette question n'est pas interactif!
Eliah Kagan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.