Grazie per tutti gli input. Cercherò di rispondere alla mia domanda ora e fornirò una guida completa alle diverse possibilità di eseguire script e binari. Modifica e commenta e saremo in grado di trovare qualcosa di completo e corretto. Ecco il mio suggerimento:
Inizialmente, due punti per affermare:
Linux fa una distinzione tra un comando e un percorso . Un comando viene digitato così com'è sul prompt e eseguirà un built-in o farà sì che Linux cerchi un binario corrispondente o uno script sul $ PATH.
Affinché Linux interpreti qualcosa come un percorso, deve contenere almeno una barra (/). Ad esempio ./myScript
, ./
può sembrare piuttosto ridondante - è lì solo per far interpretare Linux come un percorso piuttosto che un comando.
Quindi, le opzioni per eseguire un binario o uno script:
Esecuzione di un file binario 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
Esecuzione di uno script script
:
Il file dovrà disporre delle autorizzazioni di esecuzione se non diversamente specificato.
$ 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.
A proposito di lei :
Gli script con un botto (ad es. #!/bin/sh
) Sulla prima riga indicano quale interprete usare.
- Questo interprete verrà usato quando eseguito da
./script
o usando un comando: script
( script
deve essere sul PERCORSO)
- Usando
sh script
ignorerà il botto e userà, in questo caso, sh
come interprete
- Usare
. script
o source
ignorerà il botto e usare l'interprete corrente (poiché .
o source
equivale a eseguire semplicemente ogni riga dello script nella shell corrente)
Le note
* 1: questo è solo quasi vero. In bash sono effettivamente lo stesso comando, ma quando si usano source
, script
saranno cercati in $ PATH prima della directory corrente. Questo è bash, ma nelle shell solo POSIX, source
non funziona, ma .
funziona. Quindi piuttosto usa quest'ultimo per la portabilità.
* 2: ciò che realmente accade è che eseguiamo sh binario con 'script' come argomento, il che renderà 'sh' eseguirà 'script' nella sua nuova shell