Je le sais, oublie ça et réapprends. Il est temps de l'écrire.
Pour exécuter un script sh
non-exécutable, utilisez:
sh myscript
Pour exécuter un script bash
non-exécutable, utilisez:
bash myscript
Pour démarrer un fichier 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, accordez-lui les autorisations nécessaires:
chmod +x bar
./bar
Lorsqu'un fichier est exécutable, le noya est chargé de trouver comment l'exécuter. Pour les non-binaires, cela se fait en regardant la première ligne du fichier. Il devrait contenir un hashbang
:
#! /usr/bin/env bash
Le hashbang indique au noyau le programme à exécuter (dans ce cas, la commande /usr/bin/env
est exécutée avec l'argument bash
). Ensuite, le script est transmis au programme (en tant que second argument) avec tous les arguments que vous avez donnés au script en tant qu'arguments ultérieurs.
Cela signifie chaque script qui est exécutable devrait avoir un hashbang. Si ce n'est pas le cas, vous ne dites pas au noyau ce qu'il est , et le noyau ne sait donc pas quel programme utiliser pour l'interpréter. . Ce 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 le bon interprète ou il peut en analyser une partie, mais avec des différences de comportement subtiles telles que le cas entre sh
et bash
).
/usr/bin/env
Le plus souvent, vous verrez une frange de hasch comme ceci:
#!/bin/bash
Le résultat est que le noyau exécutera le programme /bin/bash
pour interpréter le script. Malheureusement, bash
n'est pas toujours livré par défaut et il n'est pas toujours disponible dans /bin
. Sur les machines Linux, c’est généralement le cas, mais il existe une gamme d’autres machines POSIX où bash
est expédié à divers emplacements, tels que /usr/xpg/bin/bash
ou /usr/local/bin/bash
.
Pour écrire un script bash portable, nous ne pouvons donc pas compter sur le codage en dur de l'emplacement du programme bash
. POSIX a déjà un mécanisme pour traiter cela: PATH
. L'idée est que vous installiez vos programmes dans l'un des répertoires situés dans PATH
et que le système puisse trouver votre programme lorsque vous souhaitez l'exécuter par nom.
Malheureusement, vous ne pouvez pas procédez comme suit:
#!bash
Le noyau ne fera pas (certains pourraient) faire une recherche PATH
pour vous. Il y a un programme qui peut faire une recherche PATH
pour vous, cependant, il s'appelle env
. Heureusement, presque tous les systèmes ont un programme env
installé dans /usr/bin
. Nous commençons donc env
en utilisant un chemin codé en dur, qui effectue ensuite une recherche PATH
pour bash
et l'exécute afin qu'il puisse interpréter votre script:
#!/usr/bin/env bash
Cette approche a un inconvénient: selon POSIX, le hashbang peut avoir n argument. Dans ce cas, nous utilisons bash
comme argument du programme env
. Cela signifie que nous n'avons plus d'espace pour passer des arguments à bash
. Il n’ya donc aucun moyen de convertir quelque chose comme #!/bin/bash -exu
à ce schéma. Vous devrez plutôt mettre set -exu
après le hashbang.
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, peut trouver cela déformé ou obsolète et avoir installé sa propre bash
ailleurs. C'est souvent le cas sous OS X (Mac) où Apple envoie un /bin/bash
obsolète et les utilisateurs installent un /usr/local/bin/bash
à jour en utilisant quelque chose comme Homebrew. Lorsque vous utilisez l'approche env
qui effectue une recherche PATH
, vous prenez en compte les préférences de l'utilisateur et utilisez son bash préféré par rapport à celui fourni avec son système.
Pour démarrer le script shell 'fichier.sh':
sh file.sh
bash file.sh
Une autre option est de définir les autorisations des exécutables à l'aide de la commande chmod:
chmod +x file.sh
Maintenant, lancez le fichier .sh comme suit:
./file.sh
Pour le Bourne Shell:
sh myscript.sh
Pour bash:
bash myscript.sh
Si vous souhaitez que le script s'exécute dans le shell actuel (par exemple, vous voulez qu'il puisse affecter votre répertoire ou votre environnement), vous devez indiquer:
. /path/to/script.sh
ou
source /path/to/script.sh
Notez que /path/to/script.sh
peut être relatif. Par exemple, . bin/script.sh
exécute le script.sh
dans le répertoire bin
sous le répertoire actuel.
L'extension de fichier .command est attribuée à Terminal.app. Double-cliquez sur un fichier .command pour l'exécuter.
Tout d'abord, donnez la permission pour l'exécution: -chmod +x script_name
sh script_name
bash script_name
./script_name
NOTE: - vous pouvez vérifier si le fichier est exécutable ou non en utilisant 'ls -a'