Quelle est la différence entre #!/ bin/sh et #!/ bin / bash?

Sous Linux et d’autres systèmes de type 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 mettez une logique compliquée comme des tuyaux, des conditions, etc.

bash est le shell le plus couramment utilisé comme shell par défaut pour les utilisateurs de systèmes Linux. C’est un descendant spirituel des 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 à la coque Bourne qu’elle a été conçue pour remplacer, bien qu’elle incorpore également des caractéristiques de la coque C et de la coque Korn.

Il est exécuté, ces jours-ci, à partir de /bin/bash – tout système avec bash l’aura accessible ici.

Ce ne sont pas seulement les utilisateurs qui utilisent des shells, cependant. Les scripts (scripts shell) ont besoin de shells 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 différents shells ont de minuscules incohérences entre eux, et quand il s’agit d’exécuter des scripts, ceux-ci peuvent être un vrai problème. bash a beaucoup de fonctionnalités de script qui ne sont uniques qu’à bash, et non à d’autres shells. C’est bien, si vous allez toujours utiliser bash pour exécuter ces scripts. D’autres shells peuvent essayer d’imiter bash ou d’adhérer à la norme 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 avec quel shell il doit être exécuté à l’aide d’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é sous la forme d’un lien symbolique pointant vers l’exécutable pour n’importe quel shell est le shell système. Le shell système est en quelque sorte le shell par défaut que les scripts système doivent utiliser. Dans les distributions Linux, pendant longtemps, c’était généralement un lien symbolique vers bash, à tel point qu’il est devenu en quelque sorte une convention de toujours lier /bin/sh à bash ou à un shell compatible bash. Cependant, au cours des deux dernières années, Debian (et Ubuntu) ont décidé de changer le shell système de bash à dash – un shell similaire rompant avec une longue tradition sous 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 scripts shell, comme 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 système) comme 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 exigent que /bin/sh puisse fonctionner lorsqu’il est pointé vers dash.

Même si le shell système d’Ubuntu pointe vers dash, votre shell de connexion en tant qu’utilisateur continue d’être bash en ce moment. Autrement dit, lorsque vous vous connectez à un émulateur de terminal n’importe où sous 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 lors de l’écriture de 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 POSIX et d’utiliser #!/bin/sh, qui devrait toujours pointer de manière assez fiable vers le shell système compatible POSIX préféré dans toute installation.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.