Il punto chiave è questo: le estensioni sono irrilevanti in qualsiasi sistema di sistema simile a Unix. Un nome file è solo un nome e non ha alcun effetto sulla possibilità di eseguire script o eseguibili compilati . Un programmatore può aggiungere .shun'estensione per designare che un file è script di shell o .pyper script Python, ma a differenza di Windows, qualsiasi unix non si preoccupa di nominare, si preoccupa delle autorizzazioni.
Ciò che conta è l'autorizzazione eseguibile concessa a un file. Con cui puoi verificare
ls -l /path/to/file
Eseguibili eseguibili
Per eseguire lo script ci sono generalmente diversi modi.
- Se la tua directory corrente è la stessa dello script e lo script ha autorizzazioni eseguibili, puoi eseguirlo in questo modo
./my_script_name. La .directory corrente significa.
- Se la directory corrente è diversa e lo script dispone delle autorizzazioni eseguibili, è possibile eseguirlo specificando il percorso completo:
/home/user/bin/my_script_name
(I due metodi precedenti si basano sul fatto che sia stata impostata l'autorizzazione eseguibile; se il file fa parte o meno della $PATHvariabile è irrilevante. Anche la presenza della #!riga è importante; senza di essa, lo script verrà eseguito dalla shell corrente che hai aperto. Se ho cshscript senza quella linea, e prova a eseguirlo in bash con ./my_script.csh, fallirà)
- Se lo script si trova nella directory che fa parte della
$PATHvariabile, è possibile eseguirlo semplicemente chiamando il nome. Puoi chiamare il chmodcomando nella riga di comando semplicemente digitandone il nome perché è nella /bincartella. /binfa sempre parte della $PATHvariabile. In questo caso, le autorizzazioni eseguibili e l'ubicazione dell'argomento script
- Specifica di un interprete come comando e script come argomento. In questo modo lo script servirà come file di input per l'interprete.
- Approvvigionamento di un file. Il
. filename.sho source filename.shfarà lo script essere trattata come se fosse input da tastiera, cioè come se sia stata scritta in linea di comando direttamente. In questo caso, le autorizzazioni e la posizione degli eseguibili non contano
Esempi
Esempio n. 1, in esecuzione con interprete, per eseguire le autorizzazioni
$-> ls -l abc.py
-rw-rw-r-- 1 xieerqi xieerqi 44 Apr 27 22:39 abc.py
$-> python abc.py
a
b
c
Esempio n. 2, in esecuzione con ./set di autorizzazioni eseguibile, set di righe 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
Esempio n. 3, in esecuzione senza set di righe shebang (non riesce, perché bash non è in grado di leggere script Python; nessuna riga shebang assume la shell corrente come interprete)
$-> cat abc.py
for letter in 'a' 'b' 'c' :
print letter
$-> ./abc.py
./abc.py: 2: ./abc.py: Syntax error: word unexpected (expecting "do")
Esempio n. 4, esecuzione di script con autorizzazioni eseguibili impostate la cartella del modulo che fa parte della $PATHvariabile
# /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'esempio n. 5, rimuovendo l'estensione, viene comunque eseguito perché le estensioni non contano, ma ha autorizzazioni ed è parte di $PATH:
$-> mv ~/bin/abc.py ~/bin/abc
$-> abc
a
b
c
.shcome estensione è in molte circostanze considerato una cattiva pratica: è contrario al modo in cui vengono denominati altri comandi (non si eseguels.elf), spesso è fuorviante (se sifoo.shinizia con#!/bin/bash, quindi l'esecuzionesh foo.shlo eseguirà con un interprete diverso da quello per cui è stato creato ) e se riscrivifoo.shper essere un programma Python, l'utilizzo di tale estensione significa che devi scegliere tra mantenere il nome ora fuorviante e riscrivere ogni programma che lo chiama.