Je sais, l'oublier et réapprendre à nouveau. Le temps de l'écrire.
Réponses
Trop de publicités?Pour exécuter un non-exécutable sh
script, utilisez:
sh myscript
Pour exécuter un non-exécutable bash
script, utilisez:
bash myscript
Pour lancer un fichier exécutable (qui est un fichier exécutable avec l'autorisation); il suffit de le spécifier par son chemin d'accès:
/foo/bar
/bin/bar
./bar
De faire un script exécutable, lui donner l'autorisation nécessaire:
chmod +x bar
./bar
Lorsqu'un fichier est exécutable, le noyau est chargé de trouver comment execte. Pour les non-binaires, c'est fait à la première ligne du fichier. Il doit contenir une hashbang
:
#! /usr/bin/env bash
Le hashbang indique au noyau de ce programme à exécuter (dans ce cas, la commande /usr/bin/env
est exécuté avec l'argument bash
). Ensuite, le script transmis au programme (deuxième argument) avec tous les arguments que vous avez donné le script comme les arguments suivants.
Cela signifie que chaque script est exécutable doit avoir un hashbang. Si ça ne marche pas, vous n'êtes pas à dire le noyau de ce qu'il est, et, par conséquent, le noyau ne sais pas quel programme utiliser pour interpréter. Il pourrait être bash
, perl
, python
, sh
, ou quelque chose d'autre. (En réalité, le noyau est souvent utiliser par défaut de l'utilisateur shell pour interpréter le fichier, ce qui est très dangereux car il pourrait ne pas être le bon interprète, ou il pourrait être en mesure d'analyser certaines de mais avec de subtiles différences comportementales comme c'est le cas entre sh
et bash
).
Une note sur l' /usr/bin/env
Le plus souvent, vous verrez hachage frange de la sorte:
#!/bin/bash
Le résultat est que le noyau va exécuter le programme d' /bin/bash
d'interpréter le script. Malheureusement, bash
n'est pas toujours livrés par défaut, et il n'est pas toujours disponible en /bin
. Alors que sur Linux, il est généralement, il existe une série d'autres POSIX machines, bash
des navires dans divers endroits, tels que l' /usr/xpg/bin/bash
ou /usr/local/bin/bash
.
Pour écrire un portable script bash, on ne peut donc pas compter sur les coder en dur l'emplacement de l' bash
programme. POSIX dispose déjà d'un mécanisme pour traiter avec que: PATH
. L'idée est que vous installez vos programmes dans l'un des répertoires qui sont dans PATH
, et le système doit être en mesure de trouver votre programme lorsque vous souhaitez exécuter par son nom.
Malheureusement, vous ne peut pas simplement faire ceci:
#!bash
Le noyau ne va pas (certains peuvent) faire un PATH
la recherche pour vous. Il y a un programme qui peut faire un PATH
recherche pour vous, même si, il est appelé env
. Heureusement, presque tous les systèmes ont un env
programme installé dans /usr/bin
. Donc, nous commençons env
codé en dur à l'aide d'un chemin, puis un PATH
recherche bash
et s'exécute en sorte qu'il peut 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
que l'argument de l' env
programme. Cela signifie que nous n'avons pas d'espace à gauche pour passer des arguments au bash
. Donc il n'y a aucun moyen de convertir quelque chose comme #!/bin/bash -exu
de ce schéma. Vous pourrez set -exu
après la hashbang à la place.
Cette approche a aussi un autre avantage: Certains systèmes sont livrés avec un /bin/bash
, mais l'utilisateur peut ne pas aimer, peut trouver, c'est buggy ou obsolètes, et peut-être installé sa propre bash
ailleurs. C'est souvent le cas sur OS X (Mac) où Apple navires de la vétusté /bin/bash
et aux utilisateurs d'installer une mise à jour, /usr/local/bin/bash
en utilisant quelque chose comme Homebrew. Lorsque vous utilisez l' env
démarche qui ne un PATH
de recherche, vous prenez la préférence de l'utilisateur en compte et d'utiliser son préféré bash sur l'un de son système livré avec.
Si vous voulez exécuter le script dans le shell courant (par exemple, vous voulez qu'il soit en mesure d'affecter votre répertoire ou de l'environnement), vous devez dire:
. /path/to/script.sh
ou
source /path/to/script.sh
Notez que /path/to/script.sh
ne peut être que relative, par exemple, . bin/script.sh
exécute l' script.sh
dans la bin
répertoire dans le répertoire courant.