In UNIX-Shell-Scripting: Was bedeutet $! erweitern?
Frage
Was ist der Sinn für $! in der Schale oder Schalen scripting? Ich versuche, ein Skript zu verstehen, die das so etwas wie die folgenden hat.
local@usr> a=1
local@usr> echo $a
1
local@usr> echo $!a
a
Es ist das Drucken der Variable zurück. Ist es für das? Was sind die anderen $ x Optionen haben wir? Wenige ich kenne, sind $$, $ * $ ?. Wenn jemand mich auf eine gute Quelle verweisen kann, wird es hilfreich sein. BTW, Dies ist in Sun OS 5.8, KSH.
Lösung
Die verschiedenen $…
Variablen sind in der Bash Handbuch . Laut Handbuch $!
erweitert auf die PID des letzten Prozesses im Hintergrund gestartet. Siehe auch:
$ echo "Foo"
Foo
$ echo $!
$ true&
[1] 67064
$ echo $!
67064
[1]+ Done true
In ksh
scheint es, dasselbe zu tun.
Andere Tipps
Von der ksh
man-Seite auf meinem System:
${!vname} Expands to the name of the variable referred to by vname. This will be vname except when vname is a name reference.
Für die Shell Sie fragen, KSH, verwenden Sie die der KSH Handbuch und lesen Sie:
Parameter Substitution
Ein Parameter ist eine Kennung, eine oder mehrere Ziffern oder irgendwelche die Zeichen *, @, #, -?!., $ und
Es ist klar, dass diejenigen, die akzeptierten Optionen $ sind *, $ @, $ #, $ ?, $ - $$ und $ !.
Mehr in der Zukunft berücksichtigt werden kann.
Für die Parameter $ !, aus dem Handbuch:
"!" Die Prozessnummer des letzten Hintergrund Befehls aufgerufen.
Wenn Sie einen Hintergrundprozess, wie sleep 60 &
beginnen, dann wird es eine Prozessnummer für einen solchen Prozess, und der Parameter $! gedruckt wird seine Nummer.
$ sleep 60 &
[1] 12329
$ echo "$!"
12329
Wenn kein Hintergrundprozess in der Ausführung ist (wie, wenn die Schale beginnt), ist die exansion leer. Es hat einen Nullwert.
$ ksh -c 'echo $!'
Wenn es ein Hintergrundprozess ist, wird es an den PID eines solchen Verfahrens erweitern:
$ ksh -c 'sleep 30 & echo $!'
42586
Deshalb echo $!a
a
erweitert. Es ist, weil es keine PID ist zu vermelden:
$ ksh -c 'echo $!a'
a
Andere Schalen können eine andere (in der Regel ziemlich ähnlich) Liste der Erweiterungen (einen Parameter mit nur einem $ und einem nächsten Zeichen).
Zum Beispiel bash diese *@#?-$!0_
als „Spezielle Parameter“ erkennen. Suchen der Bash Handbuch der Überschrift „3.4.2 Spezielle Parameter“.
Spezielle Parameter
Die Schale behandelt mehrere Parameter speziell.
Es gibt die Prozess-ID des letzten backgroundjob oder Hintergrundfunktion Bitte gehen Sie über diesen Link unten
http://www.well.ox.ac.uk/~johnb/comp/unix/ksh.html#specvar
! in Unix ist ein Referenz-Operator, obwohl sie nicht mit diesem Namen genannt.
Es bezieht sich immer auf einen Mutter-Prozess. Versuchen Sie eingeben: in vi, es dauert prompt zu befehlen, und Sie können bis zur Ausfahrt Befehl Befehle wie gewohnt durchführen.
! in SQLPLUS führt auch den Befehl von der Eingabeaufforderung. versuchen Sie dies in sqlplus
SQL>! Ls --- dies gibt die Liste der Dateien inder aktuelles Verzeichnis.
$! -. Natürlich gibt die Prozess-ID des aktuellen / latest Prozess