Perché devo inserire sh prima di eseguire i file .sh?

16

Quando voglio eseguire .sh di file in Terminale, devo mettere sh davanti a loro.

C'è un modo per evitarlo, e quindi salvare la digitazione?

    
posta More Than Five 07.09.2013 - 17:29
fonte

2 risposte

22

Se stai eseguendo il tuo script dalla shell, in realtà non hai bisogno del #!/bin/sh shebang come descritto in questo questa risposta -ogni sistema Unix-like che ho usato, incluso OS X, sarà predefinito a /bin/sh se nessun interprete è specificatamente specificato (anche se è una buona idea dato che i non-shell non sapranno come esegui la tua sceneggiatura a meno che tu non dia lo shebang.)

Inoltre non hai bisogno di un'estensione .sh . do devi impostare le autorizzazioni eseguibili, ad es.

$ chmod +x script.sh

(Il $ è il prompt della shell, lo sto usando per illustrare i comandi che date alla shell interattiva. Non digitarlo!)

Tuttavia, penso che la tua confusione sia che hai creato uno script, ad es. script.sh , nella directory corrente, e stiamo provando ad eseguirlo semplicemente digitando script.sh . per es.

$ cat >script.sh
echo hello, world
^D
$ chmod +x script.sh
$ script.sh
-bash: script.sh: command not found

( ^D significa controllo - D . Troverai questa notazione in molte pubblicazioni sull'uso di Unix.)

Il fatto che script.sh in questo caso sia uno script di shell è solo metà del problema; il tuo problema attuale è che, per impostazione predefinita, la shell non cercherà la directory corrente per un programma. Tuttavia, questo funziona:

$ sh script.sh
hello, world

perché sh sta prendendo lo script come argomento.

Puoi eseguire uno script - o, ancora, qualsiasi eseguibile - nella directory corrente, se è contrassegnato come eseguibile (cioè chmod +x ), specificando che vuoi eseguire quello in la directory corrente:

$ ./script.sh
hello, world

Puoi anche spostare lo script in una directory su PATH . Raccomando /usr/local/bin per questo se il tuo script è destinato a essere utilizzato in tutto il sistema, o una directory bin nella tua casa se lo script è solo per te. Quest'ultimo richiede di aggiungere $HOME/bin , che si espande alla tua nuova directory bin, al tuo PATH aggiungendo le seguenti righe al tuo .profile nella tua home directory:

PATH=$HOME/bin:$PATH
export PATH

Infine, puoi, se vuoi, aggiungere effettivamente la directory corrente al tuo 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 consiglio questa pratica , in quanto un utente malintenzionato può ingannare l'utente nell'esecuzione di un eseguibile arbitrario facendo cadere uno script eseguibile (denominato, ad esempio, ls ) in una directory in cui ci si troverà. Se davvero vuoi farlo, però, aggiungi quanto segue al tuo .profile :

PATH=.:$PATH
export PATH
    
risposta data 07.09.2013 - 19:36
fonte
10

Non è necessario chiamare sh se il file di script è contrassegnato come eseguibile. In tal caso, puoi chiamare il mio nome proprio come faresti con qualsiasi altro comando dalla shell esistente.

Per essere del tutto corretto, ti consigliamo di fare due cose:

  1. Modifica lo script per includere una direttiva shebang nella parte superiore dello script:

    #!/bin/sh

    ... Direbbe alla shell quale interprete usare per eseguire lo script; in questo caso, l'eseguibile /bin/sh .

  2. Contrassegna lo script come eseguibile da te con il comando chmod :

    chmod u+x scriptname.sh

Una volta eseguiti entrambi, 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 aggiunga il passo aggiunto di aggiungere la cartella contenente al tuo Variabile PATH . Se non ti interessa quale shell esegue lo script, non hai bisogno del passaggio 1 per specificare sh , ma spesso è meglio essere precisi e impostare "shebangsh".

    
risposta data 07.09.2013 - 17:34
fonte

Leggi altre domande sui tag