In UNIX shell scripting: Cosa $! espandersi?
Domanda
Qual è il significato per $! conchiglia shell scripting? Sto cercando di capire uno script che ha il qualcosa di simile alla seguente.
local@usr> a=1
local@usr> echo $a
1
local@usr> echo $!a
a
Si sta stampando la variabile di nuovo. E 'tutto per questo? Quali sono le altre opzioni di $ x che abbiamo? Pochi so essere $$, $ *, $ ?. Se qualcuno mi può puntare a una buona fonte, sarà utile. BTW, Questo è in Sun OS 5.8, KSH.
Soluzione
Le diverse variabili $…
sono descritte in Bash manuale . Secondo il manuale di $!
si espande per il PID dell'ultimo processo avviato in background. Vedi:
$ echo "Foo"
Foo
$ echo $!
$ true&
[1] 67064
$ echo $!
67064
[1]+ Done true
In ksh
sembra di fare lo stesso.
Altri suggerimenti
Dalla pagina man ksh
sul mio sistema:
${!vname} Expands to the name of the variable referred to by vname. This will be vname except when vname is a name reference.
Per la shell si sta chiedendo, ksh, utilizzare il manuale ksh , e leggere questo:
Parametro Sostituzione
Un parametro è un identificatore, una o più cifre, o una qualsiasi delle i caratteri *, @, #,, -?!., $, e
E 'chiaro che queste sono le opzioni accettate $ *, $ @, $ #, $ ?, $ -, $$ e $ !.
Più potrebbero essere inclusi in futuro.
Per il parametro $ !, dal manuale:
"!" Il numero di processo dell'ultimo comando sfondo invocato.
se si avvia un processo in background, come sleep 60 &
, allora ci sarà un numero di processo per tale processo, e il parametro $! stamperà il suo numero.
$ sleep 60 &
[1] 12329
$ echo "$!"
12329
Se non v'è alcun processo in background in esecuzione (come quando il guscio viene avviato), l'exansion è vuoto. Ha un valore nullo.
$ ksh -c 'echo $!'
Se c'è un processo in background, si espanderà al PID di tale processo:
$ ksh -c 'sleep 30 & echo $!'
42586
Questo è il motivo echo $!a
espansa a a
. E 'perché non c'è PID segnalare:
$ ksh -c 'echo $!a'
a
Altri gusci possono avere un diverso (di solito piuttosto simile) elenco delle espansioni (un parametro con un solo $ e uno carattere successivo).
Ad esempio, bash riconosce questa *@#?-$!0_
come "parametri speciali". Cerca il manuale di Bash per la rubrica "Parametri 3.4.2 speciali".
Parametri speciali
La shell tratta diversi parametri appositamente.
Si dà l'ID di processo dello scorso backgroundjob o di una funzione di sfondo Si prega di passare attraverso questo link qui sotto
http://www.well.ox.ac.uk/~johnb/comp/unix/ksh.html#specvar
! è un operatore di riferimento nel unix, anche se non è chiamato con tale nome.
Si riferisce sempre ad un processo madre. Prova a digitare:! in vi, che vi porta al prompt dei comandi e si può eseguire comandi come al solito fino comando exit.
! in SQLPLUS esegue anche il comando dal prompt dei comandi. provare questo in sqlplus
SQL>! Ls --- questo dà l'elenco dei file inthe directory corrente.
$! -. Dà, ovviamente, l'ID del processo della corrente ultimo processo /