Merci pour toutes les contributions. Je vais essayer de répondre à ma propre question maintenant et fournir un guide complet des différentes possibilités pour exécuter des scripts et des binaires. Veuillez modifier et commenter et nous pourrons trouver quelque chose de complet et correct. Voici ma suggestion :
Tout d'abord, deux points à énoncer :
-
Linux fait une distinction entre une commande et un chemin. Une commande est simplement tapée telle quelle sur l'invite de commande, et exécutera une fonction intégrée ou fera en sorte que Linux cherche un binaire correspondant ou un script dans le $PATH.
-
Pour que Linux interprète quelque chose comme un chemin, il doit contenir au moins un slash (/). Par exemple, dans ./monScript
, ./
peut sembler assez redondant - il est là uniquement pour que Linux l'interprète comme un chemin plutôt qu'une commande.
Donc, les options pour exécuter un binaire ou un script :
Exécution d'un binaire binaire
:
$ binaire # lorsque 'binaire' est sur le PATH, ou est une fonction intégrée
$ ./binaire # lorsque 'binaire' n'est pas sur le chemin mais dans le répertoire actuel
$ /home/moi/binaire # lorsque 'binaire' n'est pas sur le PATH, et pas dans le répertoire actuel
Exécution d'un script script
:
Le fichier devra avoir des permissions d'exécution sauf indication contraire.
$ script # exécuter un script qui est sur le PATH. Sera exécuté dans un nouveau shell.
# L'interpréteur à utiliser est déterminé par le she-bang dans le fichier.
$ ./script # exécuter un script qui est dans le répertoire actuel. Sinon comme ci-dessus.
$ /un/chemin/script # lorsque le script n'est pas sur le PATH et non dans le répertoire actuel.
# Sinon comme ci-dessus.
$ . script # exécute un script dans le répertoire actuel. Sera exécuté dans
# l'environnement shell actuel.
$ source script # équivalent à ce qui précède *1
$ sh script # exécute 'script' dans un nouveau shell *2 (il en va de même pour 'bash ...', 'zsh ...' etc.). Permission d'exécution non nécessaire.
À propos des she-bangs :
Les scripts avec un she-bang (par exemple, #!/bin/sh
) sur la première ligne indiquent quel interpréteur utiliser.
- Cet interpréteur sera utilisé lorsqu'il sera exécuté avec
./script
ou en utilisant une commande : script
(script
doit être sur le PATH)
- Utiliser
sh script
ignorera le she-bang et utilisera, dans ce cas, sh
comme interpréteur
- Utiliser
. script
ou source
ignorera le she-bang et utilisera l'interpréteur actuel (puisque .
ou source
équivaut à exécuter chaque ligne du script dans le shell actuel)
Notes de bas de page
*1 : Cela est seulement presque vrai. En bash, ce sont effectivement les mêmes commandes, mais en utilisant source
, script
sera recherché dans $PATH avant le répertoire actuel. C'est bash, mais dans les shells uniquement POSIX, source
ne fonctionne pas, mais .
oui. Donc il vaut mieux utiliser ce dernier pour la portabilité.
*2 : en réalité, ce qui se passe est que nous exécutons le binaire sh avec 'script' en argument, ce qui fera que 'sh' exécute 'script' dans son nouveau shell