Einführung
Ursprünglich haben wir nur eine einzige Shell auf Unix. Wann lief ein Befehl, der Shell würde versuchen, einen der exec ()-System fordert sie auf. Es wurde der Befehl eine ausführbare Datei, die exec gelingen würde und der Befehl ausgeführt. Wenn die exec () nicht, die Shell, die nicht aufgeben, sondern versuchen würde, die Auslegung der Befehl Datei, als ob es sich um ein Shell-Skript. Dies funktioniert, solange es nur eine Shell auf dem System. Aber was ist, wenn Sie mit einer Shell als interaktive und wollen, führen Sie ein Skript in einer anderen Shell die Sprache?
Dies ist, wenn die #! Trick herein Die Idee der Verwendung von #, um einen Kommentar entstand mit csh und wurde schnell in die Bourne-Shell. Jetzt wissen alle Tanks zu ignorieren Zeug nach einem #. So können wir eine führende Linie so etwas wie "#! / Usr / bin / ksh". Um die Shell diese Zeile ist nur ein Kommentar. Aber wenn der Kernel versucht, eine Datei mit dieser Linie, so wird die angegebene exec-Interpreter und die Schrift ist. So Shell-Skripten werden ausführbare ziemlich viel wie wirkliche ausführbare Dateien sind. Nun, wenn eine Shell versucht, exec ein Shell-Skript, es gelingt.
Was passiert, wenn Sie vor der #! line? Nun, die Kernel-exec fehl. Ihre durchschnittliche Schale wird dann versuchen, das Skript selbst. Ein paar Muscheln werden versuchen, um das Skript zu versuchen zu erraten, die Sprache. Dies ist nicht gut. Sie können mit ksh als interaktive Shell und Schreiben von ksh-Skripten. Wenn Sie später switch to bash als interaktive Shell, einige Ihrer Skripte ausführen können, während andere möglicherweise fehl. Auch die Linie
ist ein Kommentar , die ein wichtiger Anhaltspunkt für einen Programmierer, der sich auf das Skript, um es zu verstehen. Das Wissen um die Sprache, die der Autor versucht, zu verwenden, ist eine große Hilfe.
Zwar habe ich den Begriff "Shell", tatsächlich diese Technik verwendet werden kann mit vielen Programmen, die nicht Tanks. Hier ist ein "Skript", um eine mehrzeilige Nachricht:
Code:
#! /usr/bin/cat
Line 1
Line 2
Line 3
Dies zeigt, dass "#! / Usr / bin / cat"-Linie, aber auch andere als die, dass es funktioniert ziemlich gut.
Ein Argument
Sie können ein Argument wie folgt aus:
#! / usr / local / bin /
perl -w
Aber im Allgemeinen, die Sie auf
eins Argument. Auf den meisten Systemen, eine Zeile wie: "#! / Some / Dolmetscher-A-B" wird in "-a-b" ist die als ein einziges Argument. Allerdings ist die einzige Argument ist nicht beschränkt auf, beginnend mit einem Bindestrich. Wir können auf unsere Botschaft Skript:
Code:
#! /usr/bin/sed 1d
Line 1
Line 2
Line 3
Beispiel
Wir setzen all dies zusammen mit einem Beispiel an. Hier ist eine
perl Skript, das ich rufe 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";
Die W-fragt
perl Frage Warnmeldungen. Das Skript zeigt einfach die Argumente, dann läuft der Befehl ps. Wenn ich es, bekomme ich:
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
$
Beachten Sie, dass die
perl Prozess wurde mit 5 Argumente. Das 2. Argument ist der Name des Skripts. Es ist Aufgabe der
perl Prozess, um die letzten 3 Argumente als Argument Liste gesehen durch das Skript. Auch erkennen, den Kernel mit der
perl Prozess. Danach wird es bis zu
perl das Skript zu öffnen und zu lesen, und führen Sie jede Zeile. Dies ist der Grund, warum Skripte müssen lesbar. Sie können nicht ausgeführt eine nicht lesbare Schrift.
Fazit
Dies sollte genügend Informationen, um zu verstehen, was passiert mit den #! Linien. In den folgenden Stellen, werde ich Details zu den verschiedenen Aspekten des Prozesses.