2013-06-22 7 views
9
$ bash -c 'echo "0 is $0 1 is $1"' abc def 
0 is abc 1 is def 

$ echo 'echo "0 is $0 1 is $1"' > bashtest 

$ bash bashtest abc def 
0 is bashtest 1 is abc 

La seconda corsa è equivalente a se ho girato prova bash in uno shellscript con la faccenda e poi corse direttamente ...

Fondamentalmente io Mi chiedo perché abc non è sempre $1. Diventa $0 quando viene eseguito con bash -c.

risposta

10

Anche io non lo sapevo. Ma la man page ne parla:

stringa -c: Se l'opzione -c è presente, allora i comandi vengono letti da stringa. Se ci sono argomenti dopo la stringa, essi sono assegnati ai parametri posizionali, a partire da $ 0.

La sezione ARGUMENTS ha una spiegazione ancora più dettagliata:

ARGOMENTI

Se gli argomenti rimangono dopo la lavorazione opzione, e né la -c né l'opzione -s è stato fornito, la il primo argomento è assunto come il nome di un file contenente comandi di shell. Se bash è invocato in questo modo , $ 0 è impostato sul nome del file e il parametro posizionale - è impostato sugli argomenti rimanenti. Bash legge ed esegue le comande com da questo file, quindi esce. Lo stato di uscita di Bash è la sta- zione di uscita dell'ultimo comando eseguito nello script. Se nessun comando è eseguito, lo stato di uscita è 0. Viene inizialmente tentato di aprire il file nella directory corrente e, se non viene trovato alcun file, la shell ricerca le directory in PATH per lo script.

+0

È ragionevole, credo. Di certo non hanno un buon oggetto da impostare a '$ 0'. Avrei dovuto solo guardare la pagina di manuale; mi vergogno. –

+0

@janos Thx per la modifica! è davvero sportivo! – hek2mgl

+0

@janos Davvero un bell'articolo. :) Mi piacerebbe passare un commento. L'unico account che ho è 'google +' finora. Non puoi consentire commenti anonimi? La nota sarà AFK per un po ', ma torneremo qui più tardi .... – hek2mgl

Problemi correlati