Intéressé par des cours d'informatique en ligne ?
Visitez mon nouveau site https://www.yesik.it !

Si vous êtes familiers de l'environnement Unix, vous savez qu'il est possible d'exécuter des scripts directement à partir du shell. Pour permettre cela, il est nécessaire d'effectuer deux opérations:

  1. Tout d'abord, il faut indiquer sur la première ligne du script le chemin vers l'exécutable chargé d'interpréter le script;
  2. Ensuite, il faut utiliser la commande chmod pour autoriser l'exécution du script.

Shebang

C'est la combinaison de caractères #!chemin_vers_executable – appelée shebang – qui indique quel programme sera chargé de l'interprétation du script. Le shebang doit toujours être sur la première ligne du script, comme dans le listing du programme Python fortune.py ci-dessous:

#!/usr/bin/python
 
import random
 
# J.R.R. Tolkien - The Lord of the Rings
quotes = [
    "And he that breaks a thing to find out what it is "
    "has left the path of wisdom",
    "Faithless is he that says farewell when the road darkens",
    "It's the job that's never started as takes longest to finish",
    "One who cannot cast away a treasure at needs is in fetters",
    "Where will wants not,a way opens"
]
 
print random.choice(quotes)

Note:

Il est fortement conseillé pour des raisons de sécurité de toujours utiliser des chemins absolus dans le shebang. Et il va de soi que le chemin indiqué doit être celui vers l'interpréteur adéquat! Si sur votre système celui-ci est installé dans un autre endroit que /usr/bin vous devrez apporter les modifications en conséquence.

A titre indicatif, on peut vérifier le chemin d'un exécutable du PATH à l'aide de la commande which:

sh$  which python
/usr/bin/python

L'interpréteur doit absolument être un binaire exécutable!

L'interpréteur doit absolument être un binaire exécutable. En particulier, la syntaxe avec le shebang ne peut pas être utilisée pour désigner un script.

Avec Python, utilisé en exemple ci-dessus, ça n'est pas un problème. Puisque /usr/bin/python désigne bien un tel fichier binaire, comme on peut le vérifier avec la commande file:

sh$ file -L /usr/bin/python
/usr/bin/python: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped

Par contre, avec d'autres interpréteurs qui utilisent un script pour leur lancement, c'est problématique. Ainsi, c'est le cas pour Groovy:

sh$ file -L /usr/local/groovy/bin/groovy
/usr/local/groovy/bin/groovy: POSIX shell script text executable

Dans ce cas, l'astuce est d'utiliser la commande env dans le shebang pour lancer le script:

#!/usr/bin/env groovy

Changer les permissions

Le changement de permission se fait de manière classique avec chmod:

sh$ chmod +x fortune.py

Exécution

Une fois les deux opérations précédentes effectuées, on peut exécuter le script directement – sans avoir à préciser sur la ligne de commande le nom de l'interpréteur à utiliser:

sh$ ./fortune.py
It's the job that's never started as takes longest to finish

Remarque:

Contrairement à une idée commune, ce n'est pas le shell qui recherche le shebang en début de fichier pour déterminer si celui-ci est un script – et le cas échéant, quel programme utiliser pour l'interpréter.

En réalité, c'est le travail de la fonction système execve. Or, sur un système Unix, au final, c'est cette fonction qui est appelée à chaque fois qu'un programme doit être exécuté. Par conséquent, tout script modifié comme décrit ici (shebang + chmod) peut être exécuté à partir de tout programme et/ou script, même écrit dans un autre langage. Sans devoir forcément passer par un shell.

Ainsi, à titre d'illustration, le programme Groovy ci-dessous exécute notre script sans même se rendre compte que c'est un script Python plutôt qu'un programme natif:

println "./fortune.py".execute().text.toUpperCase()