Der entscheidende Punkt ist: Erweiterungen sind in jedem Unix-ähnlichen Systemsystem irrelevant. Ein Dateiname ist nur ein Name und hat keine Auswirkung darauf, ob ein Skript oder eine kompilierte ausführbare Datei ausgeführt werden kann . Ein Programmierer kann eine .sh
Erweiterung hinzufügen , .py
um anzugeben, dass es sich bei einer Datei um ein Shell-Skript oder um ein Python-Skript handelt. Im Gegensatz zu Windows kümmert sich ein Unix nicht um die Benennung, sondern um Berechtigungen.
Was zählt, ist die ausführbare Berechtigung, die einer Datei erteilt wird. Was Sie mit überprüfen können
ls -l /path/to/file
Ausführen von ausführbaren Dateien
Es gibt im Allgemeinen mehrere Möglichkeiten, ein Skript auszuführen.
- Wenn Ihr aktuelles Verzeichnis mit dem Skript identisch ist und das Skript über ausführbare Berechtigungen verfügt, können Sie es wie folgt ausführen
./my_script_name
. Das .
bedeutet aktuelles Verzeichnis.
- Wenn sich Ihr aktuelles Verzeichnis unterscheidet und das Skript über ausführbare Berechtigungen verfügt, können Sie es ausführen, indem Sie den vollständigen Pfad angeben:
/home/user/bin/my_script_name
(Die beiden oben genannten Methoden setzen voraus, dass die ausführbare Berechtigung festgelegt ist. Ob die Datei Teil der $PATH
Variablen ist oder nicht , spielt keine Rolle. Das Vorhandensein der #!
Zeile ist ebenfalls wichtig. Ohne diese Option wird das Skript von der aktuellen Shell ausgeführt, die Sie geöffnet haben. Wenn ich ein csh
Skript habe ohne diese Zeile, und versuchen Sie, es in bash mit auszuführen ./my_script.csh
, wird es fehlschlagen)
- Befindet sich Ihr Skript in einem Verzeichnis, das Teil Ihrer
$PATH
Variablen ist, können Sie es einfach durch Aufrufen des Namens ausführen. Sie können den chmod
Befehl in der Befehlszeile aufrufen, indem Sie einfach seinen Namen eingeben, da er sich in einem /bin
Ordner befindet. /bin
ist immer Teil der $PATH
Variablen. In diesem Fall spielen ausführbare Berechtigungen und der Speicherort des Skripts eine Rolle
- Angabe eines Interpreters als Befehl und eines Skripts als Argument. Auf diese Weise wird das Skript als Eingabedatei für den Interpreter verwendet.
- Beschaffung einer Datei. Das
. filename.sh
oder source filename.sh
bewirkt, dass das Skript so behandelt wird, als wäre es eine Tastatureingabe, dh als wäre es direkt in die Befehlszeile eingegeben worden. In diesem Fall spielen ausführbare Berechtigungen und der Speicherort keine Rolle
Beispiele
Beispiel # 1, ausgeführt mit einem Interpreter, um Berechtigungen auszuführen
$-> ls -l abc.py
-rw-rw-r-- 1 xieerqi xieerqi 44 Apr 27 22:39 abc.py
$-> python abc.py
a
b
c
Beispiel # 2, ausgeführt mit ./
ausführbarem Berechtigungssatz, Shebang Line Set.
$-> 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
Beispiel # 3, läuft ohne Shebang-Line-Set
$-> cat abc.py
for letter in 'a' 'b' 'c' :
print letter
$-> ./abc.py
./abc.py: 2: ./abc.py: Syntax error: word unexpected (expecting "do")
Beispiel 4: Ausführen eines Skripts mit festgelegten ausführbaren Berechtigungen für einen Ordner, der Teil einer $PATH
Variablen ist
# /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
Beispiel 5, Erweiterung entfernen, wird weiterhin ausgeführt, da Erweiterungen keine Rolle spielen, aber Berechtigungen haben und Teil von $PATH
:
$-> mv ~/bin/abc.py ~/bin/abc
$-> abc
a
b
c
.sh
als Erweiterung wird unter vielen Umständen als schlechte Praxis angesehen: Es ist im Gegensatz zu den Namen anderer Befehle (die Sie nicht ausführenls.elf
) oft irreführend (wenn Siefoo.sh
mit beginnen#!/bin/bash
,sh foo.sh
wird sie beim Ausführen mit einem anderen Interpreter ausgeführt, als für den sie erstellt wurde ), und wenn Sie neu schreibenfoo.sh
, um ein Python-Programm zu sein, müssen Sie bei der Verwendung dieser Erweiterung zwischen der Beibehaltung des jetzt irreführenden Namens und dem erneuten Schreiben jedes Programms wählen, das ihn aufruft.