Pour lancer le shell-script 'file.sh' :
sh file.sh
bash file.sh
Une autre option est de définir l'autorisation exécutable à l'aide de la commande chmod :
chmod +x file.sh
Exécutez maintenant le fichier .sh comme suit :
./file.sh
Pour exécuter un sh
non exécutable script, utilisez :
sh myscript
Pour exécuter un bash
non exécutable script, utilisez :
bash myscript
Pour démarrer un exécutable (qui est n'importe quel fichier avec une autorisation exécutable); il suffit de le spécifier par son chemin :
/foo/bar
/bin/bar
./bar
Pour rendre un script exécutable, donnez-lui la permission nécessaire :
chmod +x bar
./bar
Lorsqu'un fichier est exécutable, le noyau est chargé de déterminer comment l'exécuter. Pour les non-binaires, cela se fait en regardant la première ligne du fichier. Il doit contenir un hashbang
:
#! /usr/bin/env bash
Le hashbang indique au noyau quel programme exécuter (dans ce cas, la commande /usr/bin/env
est exécuté avec l'argument bash
). Ensuite, le script est passé au programme (comme deuxième argument) avec tous les arguments que vous avez donnés au script comme arguments suivants.
Cela signifie que chaque script exécutable doit avoir un hashbang . Si ce n'est pas le cas, vous ne dites pas au noyau ce qu'il est , et donc le noyau ne sait pas quel programme utiliser pour l'interpréter. Cela pourrait être bash
, perl
, python
, sh
, ou autre chose. (En réalité, le noyau utilisera souvent le shell par défaut de l'utilisateur pour interpréter le fichier, ce qui est très dangereux car ce n'est peut-être pas du tout le bon interpréteur ou il peut être capable d'en analyser une partie mais avec des différences de comportement subtiles telles que le cas entre sh
et bash
).
Une note sur /usr/bin/env
Le plus souvent, vous verrez des hachages comme ceci :
#!/bin/bash
Le résultat est que le noyau exécutera le programme /bin/bash
pour interpréter le scénario. Malheureusement, bash
n'est pas toujours livré par défaut, et il n'est pas toujours disponible en /bin
. Alors que c'est généralement le cas sur les machines Linux, il existe une gamme d'autres machines POSIX où bash
expédié à divers endroits, tels que /usr/xpg/bin/bash
ou /usr/local/bin/bash
.
Pour écrire un script bash portable, on ne peut donc pas compter sur le codage en dur de l'emplacement du bash
programme. POSIX a déjà un mécanisme pour gérer cela :PATH
. L'idée est que vous installiez vos programmes dans l'un des répertoires qui se trouvent dans PATH
et le système devrait pouvoir trouver votre programme lorsque vous souhaitez l'exécuter par son nom.
Malheureusement, vous ne pouvez pas fais juste ceci :
#!bash
Le noyau ne fera pas (certains pourraient) faire un PATH
te chercher. Il existe un programme qui peut faire un PATH
chercher pour vous, cependant, il s'appelle env
. Heureusement, presque tous les systèmes ont un env
programme installé dans /usr/bin
. Alors on commence env
en utilisant un chemin codé en dur, qui fait ensuite un PATH
rechercher bash
et l'exécute pour qu'il puisse interpréter votre script :
#!/usr/bin/env bash
Cette approche a un inconvénient :selon POSIX, le hashbang peut avoir un argument . Dans ce cas, nous utilisons bash
comme argument du env
programme. Cela signifie que nous n'avons plus d'espace pour passer des arguments à bash
. Il n'y a donc aucun moyen de convertir quelque chose comme #!/bin/bash -exu
à ce régime. Il faudra mettre set -exu
après le hashbang à la place.
Cette approche présente également un autre avantage :certains systèmes peuvent être livrés avec un /bin/bash
, mais l'utilisateur peut ne pas l'aimer, trouver qu'il est bogué ou obsolète, et peut avoir installé son propre bash
ailleurs. C'est souvent le cas sur OS X (Mac) où Apple fournit un /bin/bash
obsolète et les utilisateurs installent un /usr/local/bin/bash
à jour en utilisant quelque chose comme Homebrew. Lorsque vous utilisez le env
approche qui fait un PATH
recherche, vous tenez compte des préférences de l'utilisateur et utilisez son bash préféré par rapport à celui fourni avec son système.
Pour le coquillage :
sh myscript.sh
Pour bash :
bash myscript.sh