Innledning
Opprinnelig vi bare hadde en skallet på UNIX. Da kjørte en kommando, skallet vil forsøke å påkalle en av exec ()-systemet samtaler om det. Det kommandoen ble en kjørbar, den exec ville lykkes og kommandoen kjøres. Hvis exec () mislyktes, skallet ville ikke gi opp, i stedet ville prøve å tolke kommandoen fil som om det var et shell script. Dette fungerer bra så lenge det bare er ett skall på systemet. Men hva om du bruker et shell som interaktivt og ønsker å kjøre et script skrevet i en annen Shells språk?
Dette er hvor #! Trikset leveres i. Ideen om hjelp # å representere en kommentar kom med csh og ble raskt lagt til i Bourne shell. Nå skall vite å ignorere ting etter et #. Så kan vi legge til en ledende linje noe som "#! / Usr / bin / ksh". Til Shell denne linjen er bare en kommentar. Men hvis kjerne prøver å kjøre en fil med denne linjen, vil det exec spesifisert tolk og pass manuset til den. Så shell scripts bli kjørbar ganske mye som virkelig kjørbare filer er. Nå når et shell prøver å exec et shell script, det lykkes.
Hva om du reiser utenfor #! linjen? Vel, kjernen exec vil mislykkes. Gjennomsnittlig Shell vil deretter prøve å kjøre skriptet selv. Noen skjell vil prøve å inspisere script til å forsøke å gjette språket. Dette er ikke bra. Du kjører kanskje ksh som interaktivt shell og skriving ksh skript. Hvis du senere bytter til bash som et interaktivt shell, noen av skriptene kan fortsette å kjøre mens andre mislykkes. Også linjen
er en kommentar som gir en viktig ledetråd til en programmerer som ser på manuset å forstå det. Vet hvilke språk forfatteren forsøker å bruke er en stor hjelp.
Mens jeg har brukt begrepet "shell", faktisk denne teknikken kan brukes med mange programmer som ikke shells. Her er en "script" for å vise en multiline melding:
Code:
#! /usr/bin/cat
Line 1
Line 2
Line 3
Dette viser at "#! / Usr / bin / katt", men annet enn at det fungerer ganske bra.
Passerer et argument
Du kan sende et enkelt argument som dette:
#! / usr / local / bin /
perl -w
Men generelt, er du begrenset til
en argument. På de fleste systemer, en linje som: "#! / Noe / tolk-a-b" vil resultere i "-en-b" blir vedtatt som et enkelt argument. Men den eneste argumentet er ikke begrenset til å starte med en bindestrek. Vi kan forbedre våre melding skriptet:
Code:
#! /usr/bin/sed 1d
Line 1
Line 2
Line 3
Eksempel
La oss sette alt dette sammen med et eksempel. Her er en
perl skript som jeg vil kalle perlargs:
Code:
#! /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";
The-w spør
perl utstede advarsler. Skriptet bare viser sine argumenter, og deretter kjører ps-kommandoen. Når jeg kjører den, får jeg:
Code:
$ ./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
$
Legg merke til at
perl prosessen ble kalt med 5 argumenter. 2. argumentet er navnet på skriptet. Det er opp til
perl prosessen til å presentere den endelige 3 argumenter som argument listen sett av skript. Også innse kjernen startet
perl prosessen. Etter det er det opp til
perl å åpne script og lese den og kjøre hver linje. Dette er grunnen til at prosedyrer må være leselig. Du kan ikke kjøre en ikke-lesbare skriptet.
Konklusjon
Dette bør være nok informasjon til å forstå hva som skjer med dem #! linjer. I følgende innlegg, vil jeg legge til informasjon om ulike aspekter av prosessen.