web-dev-qa-db-fra.com

Le script bash est-il identique au script shell?

Je suis très nouveau sur Ubuntu. J'entends des gens dire "scripts Shell", "scripts bash".

Je me demande s'ils sont pareils? Ou sont-ils différents?

55
batman

Bash (bashname__) est l’un des nombreux shells Unix disponibles (mais les plus utilisés). Bash signifie "B ourne A gain SH ell" et constitue un remplacement/une amélioration du Bourne Shell d'origine. (shname__).

Les scripts shell sont des scripts en tous les shell , alors que les scripts Bash sont des scripts spécifiquement conçus pour Bash. En pratique cependant, "script Shell" et "script bash" sont souvent utilisés de manière interchangeable, à moins que le shell en question ne soit pas Bash.

EDIT: En réalité, le shell de script par défaut dans Ubuntu est dash, tandis que le shell interactif par défaut (ce que vous obtenez si vous extrayez un terminal) est Bash. Néanmoins, les deux termes sont encore essentiellement interchangeables.

50
Hilton Shumway

Introduction

Les scripts shell et Bashne constituent pas la même chose, car il existe d'autres shells, tels que shname__, qui peuvent être utilisés pour exécuter un script; un script destiné à être exécuté par Bashdoit être étiqueté comme un script Bashname__. Les termes sont souvent utilisés indifféremment car Bashname__, avec ses fonctionnalités étendues par rapport à shname__, est celui qui est le plus couramment utilisé pour exécuter des scripts utilisateur dans de nombreuses distributions. Cependant, il existe d’autres shells tels que Korn (ksh), C Shell (csh) et Z Shell (zsh), mais nous n’entrerons pas dans ceux-ci ici comme une discussion sur les noms shet bashvariable__ est tout à fait pertinente pour Ubuntu. Un excellent article d'IBM ici décrit plus en détail l'évolution des shells sous Linux et décrit bien l'architecture du shell et les différences entre les shells.

Script shell

Shétait le shell Unix original développé par Stephen Bourne; Cependant, les systèmes Debian et Ubuntu considèrent dashcomme leur shshell (shest en fait un lien symbolique vers dashname__). Dans Debian et Ubuntu, en raison de la rapidité de shname__, il est plus souvent utilisé pour les procédures système critiques et pour l’exécution de scripts de clé au démarrage; pour plus de détails, voir le wiki Ubunt . Bashreprésente le shell Bourne Again et a été développé plus tard par Brian Fox et a beaucoup étendu le nom shoriginal. Le développement de Bashpar Fox et d'autres personnes constituait une partie importante du projet GNU. Voir this grande discussion de l'historique de Bashpour plus d'informations.

Il est important de noter que shet Bashname__, tels qu'ils sont utilisés dans Ubuntu et d'autres distributions, sont conformes à POSIXname__, ce qui signifie qu'ils souscrivent à un certain nombre de normes relatives à la manière dont les commandes sont exécutées dans le shell. Cela garantit que les résultats des scripts utilisés dans le système d'exploitation peuvent être prédits de manière fiable et que le comportement du shell peut être conservé dans ces paramètres POSIXname__, ce qui est particulièrement important pour les développeurs. Pour plus d'informations sur les normes, voir la documentation officielle .

Les scripts de shell ont souvent le suffixe .sh, même s'ils sont destinés à être exécutés sous la forme de scripts bashname__, et ont #!/bin/bash en haut du script. Peu importe que le script soit appelé script.sh ou my.script , l’important est de savoir si l’appel à la interprète est /bin/sh ou /bin/bash. Les scripts de shell peuvent également être appelés sur la ligne de commande avec shou bashname__.

Cependant, il est important de noter que les résultats peuvent différer en fonction de l'interpréteur appelé, car toutes les commandes bashne fonctionneront pas avec shname__, alors que la plupart Les commandes shfonctionneront dans bashname__. En général, la plupart des utilisateurs voudront utiliser /bin/bash pour leurs scripts afin de pouvoir tirer parti des fonctionnalités étendues. Les scripts système peuvent être exécutés avec /bin/sh si nécessaire.

Ressources pour la création de scripts Bash Shell

Il est parfois difficile de trouver des ressources utiles en ligne qui respectent les bonnes pratiques et donnent des conseils vous permettant de créer des scripts utiles. Après man bash, certaines des ressources les plus importantes sont wiki , Bash hackers de Greg et le livre récent de Steve Parker sur les scripts Shell, qui se concentre principalement sur Bashet publié par O'Reilly. Une bonne introduction est également entreprise par le Guide du débutant Bash .

26
user76204

Plusieurs shells sont disponibles pour Ubuntu, tels que bash, zsh, ksh, tcsh et csh.

Donc, chaque fois que quelqu'un dit Shell, il en parle. Cependant, ces coquilles diffèrent un peu les unes des autres. Ainsi, lorsque quelqu'un parle du script bash, il utilise un shell, mais lorsque quelqu'un parle du script shell, il n'utilise pas lui-même bash. Mais comme bash est couramment utilisé dans les scripts pour Ubuntu, il l’est habituellement. De plus, les différentes coquilles sont identiques à bien des égards, donc cela n’a généralement aucune importance.

4
fromnaboo

Un script shell serait défini comme un script orienté vers la portabilité pouvant être exécuté. par un shell système de systèmes d’exploitation compatibles POSIX. La syntaxe serait identique ou similaire à la syntaxe du langage de script Shell définie par le standard POSIX. C’est la norme pour la plupart des systèmes d’exploitation compatibles POSIX, tels que Linux/Unix/* BSD, etc. POSIX est le fondement le plus courant en matière de compatibilité entre systèmes d’exploitation.

Différents systèmes d'exploitation des systèmes susmentionnés implémentent différents shells pour un usage non interactif (c'est-à-dire pour exécuter des scripts système ou des scripts utilisant #! /bin/sh Shebang) qui, en plus d'implémenter les commandes et la syntaxe POSIX, possèdent leurs propres extensions ou peuvent éventuellement être supprimés de certains moins utiles fonctions pour des raisons de performances, mais la solution POSIX permet un très haut niveau de portabilité des scripts conçus pour différents systèmes Oss compatibles POSIX.

La plupart des systèmes d’exploitation mentionnés ci-dessus ont un shell interactif distinct, généralement complet bash . Bash est en grande partie compatible avec POSIX, mais dispose également d'un grand pool de commandes supplémentaires et prend en charge une syntaxe différente. Démarrer Bash avec l'option de ligne de commande --posix ou exécuter 'set -o posix' alors que Bash est en cours d'exécution permettra à Bash de se conformer davantage au standard POSIX en modifiant le comportement de celui-ci pour qu'il corresponde à celui spécifié par POSIX dans les zones où la valeur par défaut de Bash est utilisée. diffère, voir: https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html

Shebang spécificateur et chemins uniformes pour les exécutables Shell sur les systèmes d'exploitation de type Unix

Grâce aux règles uniformes sur le placement des exécutables pour les shells (ils se trouvent généralement dans le répertoire '/ bin /'), nous pouvons avoir des règles uniformes pour la création de scripts Shell. Plus précisément, nous savons clairement quel chemin mettre dans l'expression Shebang à pointer un exécutable Shell approprié pour exécuter le script. Les systèmes de fichiers Unix/Linux/* BSD ne prennent pas en charge les extensions intrinsèquement. Par conséquent, les extensions de fichier servent uniquement de conseil supplémentaire ou d'indexation.

Sur Debian/Ubuntu en particulier, bin/sh est un lien symbolique pointant vers bin/dash, qui est un exécutable d’un shell dash . Cela rend dash le système Shell, qui est estimé à être 4x plus rapide et est environ 1/10 taille que le bash plus fonctionnel. source: https://unix.stackexchange.com/questions/148035/is-dash-or-some-other-Shell-faster-than-bash

Le terminal interactif Debian/Ubuntu est par défaut, comme dans beaucoup d'autres systèmes d'exploitation de type Unix, bash, pour lequel le chemin est également uniforme: /bin/bash.

Norme POSIX.1-2017: http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html

La règle générale serait:

Si une commande ou une option n'est pas définie par POSIX, ne la placez pas dans un script #! /bin/sh.

Convertissez votre script ou recherchez les erreurs

Pour convertir votre script de bash en formulaire POSIX, vous pouvez vérifier automatiquement la présence de bugs dans votre script Shell ou voir les modifications à apporter à votre script bash pour le rendre compatible POSIX:

https://www.shellcheck.net/

http://mywiki.wooledge.org/Bashism

2
Ola
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 29 11:53 /bin/sh -> dash*
$ ls -l /bin/dash
-rwxr-xr-x 1 root root 109768 Mar 29 11:53 /bin/dash*
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 955024 Apr  3 08:58 /bin/bash*

Cela montre que 'sh' est un lien symbolique vers 'dash' et que/bin/bash, qui est le shell interactif par défaut sous Ubuntu, est un exécutable presque 9 fois plus grand que/bin/sh.

En effet, "homme sh" (1590 lignes) vs "homme bash" (5459 lignes) révèle que bash est un grand sur-ensemble du traditionnel "sh".

Lire la suite ici:

2
arielf