Quando voglio eseguire i .sh
file in Terminal, devo metterli sh
di fronte.
C'è un modo per evitarlo e quindi salvare la digitazione?
Quando voglio eseguire i .sh
file in Terminal, devo metterli sh
di fronte.
C'è un modo per evitarlo e quindi salvare la digitazione?
Risposte:
Se stai eseguendo il tuo script dalla shell, in realtà non hai bisogno dello #!/bin/sh
shebang come indicato in questa risposta - ogni sistema simile a Unix che ho usato, incluso OS X, sarà predefinito /bin/sh
se nessun interprete è specificamente specificato ( sebbene sia una buona idea poiché i non shell non sapranno come eseguire il tuo script se non dai lo shebang.)
Inoltre non hai bisogno di .sh
un'estensione. Si fa necessità di impostare le autorizzazioni eseguibili, ad esempio,
$ chmod +x script.sh
( $
È il prompt della shell; lo sto usando per illustrare i comandi che dai alla shell interattiva. Non digitarlo!)
Tuttavia, penso che la tua confusione sia che hai creato uno script, ad esempio script.sh
, nella directory corrente e stai provando a eseguirlo semplicemente digitando script.sh
. per esempio
$ cat >script.sh
echo hello, world
^D
$ chmod +x script.sh
$ script.sh
-bash: script.sh: command not found
( ^D
significa control- D. Troverai questa notazione in molti articoli sull'uso di Unix.)
Il fatto che script.sh
in questo caso sia uno script di shell è solo metà del problema; il vero problema è che, per impostazione predefinita, la shell non cercherà un programma nella directory corrente. Tuttavia, questo funziona:
$ sh script.sh
hello, world
perché sh
sta prendendo la sceneggiatura come argomento.
È possibile eseguire uno script o, di nuovo, qualsiasi eseguibile, nella directory corrente, se è contrassegnato come eseguibile (ovvero chmod +x
), specificando che si desidera eseguire quello nella directory corrente:
$ ./script.sh
hello, world
Puoi anche spostare lo script in una directory sul tuo PATH
. Raccomando /usr/local/bin
per questo se lo script è destinato a essere utilizzato a livello di sistema o una bin
directory nella propria home se lo script è solo per te. Quest'ultimo richiede che tu aggiunga $HOME/bin
, che si espande alla tua nuova directory bin, alla tua PATH
aggiungendo le seguenti righe alla tua .profile
nella tua home directory:
PATH=$HOME/bin:$PATH
export PATH
Infine, puoi, se vuoi, aggiungere effettivamente la directory corrente alla tua PATH
, che ti permetterà di andare semplicemente in una directory contenente script.sh
–o qualsiasi altro eseguibile – e digitare
$ script.sh
per eseguirlo. Tuttavia, non raccomando questa pratica , poiché un utente malintenzionato può ora indurti a eseguire un eseguibile arbitrario rilasciando uno script eseguibile (chiamato, diciamo, ls
) in una directory in cui ti troverai. Se vuoi davvero farlo, però, aggiungi quanto segue al tuo .profile
:
PATH=.:$PATH
export PATH
sl
o di lls
o l
... cioè, errori di battitura. Basta uscire .
da $PATH
. Inoltre, potresti non (o non dovresti) fidarti necessariamente di tutti sul tuo sistema. Ad esempio, supponiamo che ci sia qualche exploit che consente a un utente malintenzionato di rilasciare un file arbitrario in una directory, ma hanno bisogno che tu lo esegua per passare a un exploit migliore (ad esempio, raccogliere dati e telefonare a casa). Difesa in profondità!
/tmp
un'altra directory scrivibile a livello mondiale.
/tmp
et al. vieni con il territorio.
Non è necessario chiamare sh
se il file di script è contrassegnato come eseguibile. In tal caso, è possibile chiamarlo come si farebbe con qualsiasi altro comando dalla shell esistente.
Per essere del tutto corretto, ti consigliamo di fare due cose:
Modifica il tuo script per includere una direttiva shebang nella parte superiore del tuo script:
#!/bin/sh
... Questo direbbe alla shell quale interprete usare per eseguire lo script; in questo caso, l' /bin/sh
eseguibile.
Contrassegna lo script come eseguibile da te con il comando chmod :
chmod u+x scriptname.sh
Una volta eseguite entrambe, dovresti essere in grado di eseguire lo script digitando il nome del file dello script nella riga di comando. Dovrai trovarti nella stessa directory del tuo script, a meno che tu non faccia anche il passo aggiunto per aggiungere la cartella contenente alla tua variabile PATH . Se non ti interessa quale shell esegue lo script, non è necessario specificare il primo passaggio, sh
ma spesso è meglio essere precisi e impostare "shebangsh".
/bin/sh
, anche se non fanno male.
ksh
miei tempi scrivevo molti script su HP-UX, ma è bene sapere che non è strettamente necessario.
exec
syscall, ottieni ENOEXEC
(errore formato exec ). Mi dispiace, @bmike, @ ChrisW.Rea. Ora vado a modificare la mia risposta.