2010-03-18 13 views
15

Ho uno script che assomiglia a questocosa è la differenza tra l'esecuzione di uno script di shell come ./script.sh e sh script.sh

#!/bin/bash 

function something() { 
echo "hello world!!" 
} 

something | tee logfile 

Ho impostato il permesso di esecuzione su questo file e quando provo eseguire il file come questo

$./script.sh 

funziona perfettamente bene, ma quando l'eseguo sulla riga di comando come questo

$sh script.sh 

Genera un errore. Perché questo accade e quali sono i modi in cui posso risolvere questo problema.

risposta

21

L'esecuzione come ./script.sh farà in modo che il kernel legga la prima riga (lo shebang), quindi invochi bash per interpretare lo script. Eseguendolo come sh script.sh utilizza qualsiasi shell il tuo sistema imposta automaticamente sh su (su Ubuntu questo è Dash, che è sh-compatibile, ma non supporta alcune delle funzionalità extra di Bash).

È possibile risolvere il problema invocando come bash script.sh, o se è la macchina è possibile modificare /bin/sh essere bash e non tutto ciò che è attualmente (di solito solo da un collegamento simbolico - rm /bin/sh && ln -s /bin/bash /bin/sh). Oppure puoi semplicemente usare ./script.sh invece se già funziona;)

Se la tua shell è effettivamente dash e vuoi modificare lo script per essere compatibile, https://wiki.ubuntu.com/DashAsBinSh ha una guida utile alle differenze. Nel tuo esempio sembra che dovresti semplicemente rimuovere la parola chiave function.

+1

Non è la shell che legge la prima riga dello script ma il kernel tramite una delle chiamate di sistema exec(). – Beano

+0

Per essere un po 'più generico, il kernel cerca un costrutto hash-bang sulla prima riga dello script ed esegue l'interprete (cioè la shell) chiamato su quella linea (insieme alle opzioni che vengono dopo l'interprete). L'OP ha specificato che l'hash-bang era '#!/Bin/bash', quindi il kernel inizia * bash *. Allo stesso modo l'OP ha specificato che il file era eseguibile, che è richiesto per 'path/to/script.sh', ma non per' sh script.sh'. –

0

sh script.sh impone lo script da eseguire all'interno della shell sh.

mentre semplicemente partendo dalla riga di comando utilizza la shell-environemnt siete in.

si prega di inviare il messaggio di errore per ulteriori risposte.

Casuale su quale potrebbe essere l'errore: il percorso specificato in prima riga/bin/bash è errato - forse bash non è installato?

+0

Spetta al kernel decidere cosa fare con uno script eseguito come './Script.sh'.In quasi tutte le situazioni, se la prima riga è una linea hash-bang, il kernel avvierà l'interprete chiamato su quella linea con il nome del percorso dello script come argomento successivo (dopo ogni opzione fornita sulla linea hash-bang). Puoi eseguire qualsiasi shell (* zsh *, * dash *, * ksh *, * fish *, * tcsh *, ecc.) E 'path/to/script.sh' userà l'interprete specificato nell'hash-bang linea. –

1

se lo script è nella directory di lavoro corrente e si emette ./script.sh, il kernel leggerà lo shebang (prima riga) ed eseguirà l'interprete di shell definito. si può anche chiamare il script.sh specificando il percorso dell'interprete esempio

/bin/bash myscript.sh 
/bin/sh myscript.sh 
/bin/ksh myscript.sh etc 

Tra l'altro, si può anche mettere la vostra shebang come questo (se non si desidera specificare il percorso completo)

#!/usr/bin/env sh 
+1

In realtà il kernel è chi interpreta lo shebang, non la shell. – user85509

Problemi correlati