Merci pour toute la contribution. 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 proposer quelque chose de complet et de correct. Voici ma suggestion:
Dans un premier temps, deux points à préciser:
Linux fait une distinction entre une commande et un chemin . Une commande est tapée telle quelle à l'invite et exécutera une commande intégrée ou obligera Linux à rechercher un binaire ou un script correspondant sur $ PATH.
Pour que Linux interprète quelque chose comme un chemin, il doit contenir au moins une barre oblique (/). Par exemple, dans ./myScript
, ./
peut sembler assez redondant - il n'est là que pour que Linux l'interprète comme un chemin plutôt que comme une commande.
Ainsi, les options pour exécuter un binaire ou un script:
Exécuter un binaire binary
:
$ binary # when 'binary' is on the PATH, or is a built-in
$ ./binary # when 'binary' is not on the path but in the current directory
$ /home/me/binary # when 'binary' is not on the PATH, and not in the current dir
Exécuter un script script
:
Le fichier devra avoir des autorisations d'exécution, sauf indication contraire.
$ script # execute a script that is on PATH. Will be executed in a new shell.
# The interpreter to use is determined by the she-bang in the file.
$ ./script # execute a script that is in the current dir. Otherwise as above.
$ /a/dir/script # when the script is not on the PATH and not in current dir.
# Otherwise as above.
$ . script # execute a script in the current dir. Will be executed in the
# current shell environment.
$ source script # equivalent to the above *1
$ sh script # executes 'script' in a new shell *2 (the same goes for 'bash ...',
# 'zsh ...' etc.). Execute permission not neccessary.
À propos de la frange :
Les scripts avec un coup (par exemple #!/bin/sh
) sur la première ligne indiquent quel interprète utiliser.
- Cet interpréteur sera utilisé lorsqu'il sera exécuté par
./script
ou en utilisant une commande: script
( script
doit être sur le CHEMIN)
- L'utilisation
sh script
ignorera le coup et utilisera, dans ce cas, sh
comme interprète
- Utiliser
. script
ou source
ignorera le she-bang et utilisera l'interpréteur actuel (car .
ou source
équivaut à simplement exécuter chaque ligne du script dans le shell actuel)
Notes de bas de page
* 1: Ce n'est que presque vrai. En bash ce sont en effet la même commande, mais lors de l'utilisation source
, script
seront recherchés dans $ PATH avant le répertoire courant. C'est bash, mais dans les shells POSIX uniquement, source
cela ne fonctionne pas, mais .
ça marche . Utilisez donc plutôt ce dernier pour la portabilité.
* 2: ce qui se passe en fait, c'est que nous exécutons le sh binaire avec 'script' comme argument, ce qui fera que 'sh' exécutera 'script' dans son nouveau shell