Introduzione
Originariamente, si era solo uno shell su unix. Quando era un comando, la shell avrebbe cercato di invocare uno dei exec () chiamate di sistema su di esso. E 'il comando è un eseguibile, exec sarebbe successo e sarebbe il comando. Se il exec () non riuscito, la shell non rinunciare, invece che cercare di interpretare il file di comandi come se si trattasse di uno script di shell. Questo funziona bene fino a quando non vi è solo una shell sul sistema. Ma cosa succede se si utilizza uno shell interattiva e come desidera eseguire uno script di shell in un altro scritto della lingua?
Questo è dove il #! trucco entra L'idea di utilizzare # per rappresentare un commento origine con csh e rapidamente è stato aggiunto alla shell Bourne. Ora tutti i serbatoi in grado di ignorare roba dopo un #. Quindi, si può aggiungere una linea di qualcosa come "#! / Usr / bin / ksh". Per la shell di questa linea è un commento. Ma se il kernel cerca di eseguire un file con questa linea, si exec specificato interprete e passare lo script ad esso. Quindi, gli script di shell eseguibile diventare molto reale, come sono eseguibili. Ora, quando una shell tenta di eseguire uno script di shell, riesce.
Che cosa succede se si lascia fuori il #! linea? Ebbene, il kernel exec non andrà a buon fine. I vostri media shell quindi provare a eseguire lo script stesso. A pochi gusci si tenta di controllare lo script per cercare di indovinare la lingua. Questo non è buono. Potrebbe essere in esecuzione ksh come shell interattiva e la scrittura di script ksh. Se poi passare a bash come shell interattiva, alcuni dei vostri scritti possono continuare a funzionare, mentre altre potrebbero non funzionare. Anche la linea
è un commento che fornisce un importante indizio di un programmatore che guarda lo script per capire. Conoscere la lingua che l'autore è il tentativo di utilizzo è di grande aiuto.
Anche se ho usato il termine "guscio", in realtà questa tecnica può essere usato con molti programmi che non sono conchiglie. Qui è un "script" per visualizzare un messaggio multilinea:
Codice:
#! /usr/bin/cat
Line 1
Line 2
Line 3
Questo display che "#! / Usr / bin / cat", ma diverso da quello, funziona abbastanza bene.
Passaggio di un argomento
È possibile passare un singolo argomento come questo:
#! / usr / local / bin /
perl -w
Ma, in generale, si sono limitati a
uno argomento. Nella maggior parte dei sistemi, una riga come: "#! / Alcuni / interprete-uno-b" si tradurrà in "-a-b '" essere passati come un singolo argomento. Tuttavia, l'unico argomento non è limitata a partire con un trattino. Siamo in grado di migliorare il nostro messaggio di script:
Codice:
#! /usr/bin/sed 1d
Line 1
Line 2
Line 3
Esempio
Mettiamoci tutti insieme con un esempio. Qui è un
perl script che chiamerò perlargs:
Codice:
#! /usr/local/bin/perl -w
#! /usr/local/bin/perl -w
print "script name is ", $0, "\n";
while (@ARGV) {
$ARGV = shift @ARGV;
print "argument ", $i++, " is ", $ARGV, "\n";
}
system "ps -f -ww";
Il w-chiede
perl questione dei messaggi di avviso. Lo script visualizza semplicemente i suoi argomenti, poi lancia il comando ps. Quando ho eseguito, ho:
Codice:
$ ./perlargs one two three
Name "main::i" used only once: possible typo at ./perlargs line 10.
script name is ./perlargs
argument 0 is one
argument 1 is two
argument 2 is three
UID PID PPID STIME TTY TIME CMD
perderabo 69 1 17:47:28 n01 0:00.24 /bin/ksh -l
perderabo 201 69 18:28:22 n01 0:00.03 /usr/local/bin/perl -w ./perlargs one two three
perderabo 2055 201 18:28:22 n01 0:00.01 ps -f -ww
$
Si noti che il
perl processo è stato chiamato con 5 argomenti. Il 2 ° argomento è il nome dello script. Spetta al
perl processo di presentazione della rendicontazione finale 3 argomenti come la lista degli argomenti visto dallo script. Anche la realizzazione del kernel avviato il
perl processo. Dopo di che, è fino a
perl per aprire e leggere il copione e l'esecuzione di ogni riga. Questo è il motivo per cui gli script devono essere leggibili. Non è possibile eseguire uno script di non-leggibile.
Conclusione
Questo dovrebbe essere di informazioni sufficienti per capire che cosa sta succedendo con quelle #! linee. Nel seguente post, vorrei aggiungere dettagli sui vari aspetti del processo.