Le point clé est le suivant: les extensions ne sont pas pertinentes dans tout système système de type Unix. Un nom de fichier est juste un nom et n'a aucun effet sur l'exécution ou non d'un script ou d'un exécutable compilé . Un programmeur peut ajouter une .sh
extension pour désigner qu'un fichier est un script shell, ou .py
pour un script python, mais contrairement à Windows, tout unix ne se soucie pas du nom, il se soucie des autorisations.
Ce qui importe, c'est l'autorisation exécutable accordée à un fichier. Avec lequel vous pouvez vérifier
ls -l /path/to/file
Exécuter des exécutables
Pour exécuter un script, il existe généralement plusieurs méthodes.
- Si votre répertoire actuel est le même que le script et que le script dispose d'autorisations exécutables, vous pouvez l'exécuter comme tel
./my_script_name
. Le .
répertoire courant moyen.
- Si votre répertoire actuel est différent et que le script dispose d'autorisations exécutables, vous pouvez l'exécuter en spécifiant le chemin complet:
/home/user/bin/my_script_name
(Les deux méthodes ci-dessus reposent sur un ensemble d'autorisations exécutables; que le fichier fasse partie de la $PATH
variable ou non. La présence de la #!
ligne est également importante; sans elle, le script sera exécuté par le shell actuel que vous avez ouvert. Si j'ai un csh
script sans cette ligne, et essayez de l'exécuter en bash avec ./my_script.csh
, cela échouera)
- Si votre script se trouve dans un répertoire faisant partie de votre
$PATH
variable, vous pouvez l'exécuter simplement en appelant le nom. Vous pouvez appeler la chmod
commande en ligne de commande en tapant simplement son nom car il se trouve dans le /bin
dossier. /bin
fait toujours partie de la $PATH
variable. Dans ce cas, les autorisations exécutables et l'emplacement du sujet du script
- Spécification d'un interpréteur comme commande et d'un script comme argument. De cette façon, le script servira de fichier d'entrée à l'interpréteur.
- Sourcing d'un fichier. Le
. filename.sh
ou source filename.sh
fera en sorte que le script soit traité comme s'il s'agissait d'une entrée au clavier, c'est-à-dire comme s'il était tapé directement en ligne de commande. Dans ce cas, les autorisations exécutables et l'emplacement n'ont pas d'importance
Exemples
Exemple # 1, en cours d'exécution avec interprète, pour exécuter des autorisations
$-> ls -l abc.py
-rw-rw-r-- 1 xieerqi xieerqi 44 Apr 27 22:39 abc.py
$-> python abc.py
a
b
c
Exemple # 2, exécuté avec ./
un ensemble d'autorisations exécutables, un ensemble de lignes shebang.
$-> cat abc.py
#!/usr/bin/env python
for letter in 'a' 'b' 'c' :
print letter
$-> ls -l abc.py
-rwxrwxr-x 1 xieerqi xieerqi 66 Apr 27 23:02 abc.py*
$-> ./abc.py
a
b
c
Exemple # 3, s'exécutant sans jeu de lignes shebang (échoue, car bash ne peut pas lire les scripts python; aucune ligne shebang n'assume le shell actuel comme interpréteur)
$-> cat abc.py
for letter in 'a' 'b' 'c' :
print letter
$-> ./abc.py
./abc.py: 2: ./abc.py: Syntax error: word unexpected (expecting "do")
Exemple # 4, exécution d'un script doté d'autorisations exécutables, dossier de formulaire défini faisant partie de la $PATH
variable
# /home/xieerqi/bin is part of my path variable
$-> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/microchip/xc16/v1.25/bin:/opt/microchip/xc32/v1.40/bin:/opt/microchip/xc8/v1.35/bin:/home/xieerqi/bin:/home/xieerqi/bin/sh
$-> # current directory is /home/xieerqi
$-> pwd
/home/xieerqi
$-> # move the file to ~/bin
$-> mv ~/abc.py ~/bin/abc.py
$-> # now I can run it just by calling the name
$-> abc.py
/home/xieerqi/bin/abc.py: 2: /home/xieerqi/bin/abc.py: Syntax error: word unexpected (expecting "do")
$-> # Syntax error because again, no interpreter specified.
$-> # must add #!/usr/bin/env python
$-> vi /home/xieerqi/bin/abc.py
$-> # after adding the line with vi text editor, we can run
$-> abc.py
a
b
c
L'exemple n ° 5, suppression d'une extension, s'exécute toujours car les extensions n'ont pas d'importance, mais il dispose d'autorisations et fait partie de $PATH
:
$-> mv ~/bin/abc.py ~/bin/abc
$-> abc
a
b
c
.sh
en tant qu'extension est dans de nombreuses circonstances considérée comme une mauvaise pratique: elle est contraire à la façon dont les autres commandes sont nommées (vous ne les exécutez pasls.elf
), elle est souvent trompeuse (si vousfoo.sh
commencez par#!/bin/bash
, alors l'exécutionsh foo.sh
s'exécutera avec un interpréteur différent de celui pour lequel elle est conçue) ), et si vous réécrivezfoo.sh
pour être un programme Python, l'utilisation de cette extension signifie que vous devez choisir entre conserver le nom désormais trompeur et réécrire chaque programme qui l'appelle.