En UNIX shell scripting: ¿Qué $! ampliar a?
Pregunta
¿Cuál es el significado de $! en shell o shell scripting? Estoy tratando de comprender una secuencia de comandos que tiene el algo como lo siguiente.
local@usr> a=1
local@usr> echo $a
1
local@usr> echo $!a
a
Se está imprimiendo la variable espalda. Es todo para que eso? ¿Cuáles son las otras opciones $ x que tenemos? Pocos que conozco están $$, $ *, $ ?. Si alguien me puede apuntar a una buena fuente, que será útil. Por cierto, esta es en Sun OS 5.8, KSH.
Solución
Las diversas variables $…
se describen en Bash manual . De acuerdo con el manual de $!
expande al PID del último proceso iniciado en el fondo. Ver:
$ echo "Foo"
Foo
$ echo $!
$ true&
[1] 67064
$ echo $!
67064
[1]+ Done true
En ksh
parece hacer lo mismo.
Otros consejos
Desde la página del ksh
en mi sistema:
${!vname} Expands to the name of the variable referred to by vname. This will be vname except when vname is a name reference.
Para el shell que está pidiendo, ksh, utilice el el manual de ksh y leer lo siguiente:
sustitución de parámetros
Un parámetro es un identificador, uno o más dígitos, o cualquiera de los caracteres *, @, #, -., $, y
Está claro que esas son las opciones aceptadas $ *, $ @, # $, $ ?, $ -, $$ y $ !.
Más podrían incluirse en el futuro.
Para el parámetro $ !, del manual:
"!" El número de proceso del último comando invoca fondo.
si se inicia un proceso de fondo, como sleep 60 &
, entonces habrá un número de proceso para tal proceso, y el parámetro $! imprimirá su número.
$ sleep 60 &
[1] 12329
$ echo "$!"
12329
Si no hay un proceso de fondo en ejecución (como cuando se inicia la cáscara), la exansion está vacía. Tiene un valor nulo.
$ ksh -c 'echo $!'
Si hay un proceso en segundo plano, se expandirá al PID de dicho proceso:
$ ksh -c 'sleep 30 & echo $!'
42586
Es por eso que echo $!a
expandió a a
. Es porque no hay PID reportar:
$ ksh -c 'echo $!a'
a
Otros proyectiles pueden tener una lista diferente (por lo general bastante similar) de las expansiones (un parámetro con una sola $ y un carácter siguiente).
Por ejemplo, golpe del *@#?-$!0_
reconoce esto como "Parámetros especiales". Buscar la manual de Bash para el título "Parámetros especiales" 3.4.2.
Parámetros especiales
La cáscara trata a varios parámetros especialmente.
Se da el ID de proceso del último backgroundjob o la función de fondo Por favor, vaya a través de este enlace
http://www.well.ox.ac.uk/~johnb/comp/unix/ksh.html#specvar
! es un operador de referencia en UNIX, aunque no se conoce con ese nombre.
Siempre se refiere a un proceso madre. Pruebe a escribir: en vi, que le lleva a símbolo del sistema y se puede ejecutar comandos como de costumbre hasta que el comando de salida.
! en SQLPLUS también ejecuta el comando desde la línea de comandos. tratar esto en sqlplus
SQL> ls --- esto da la lista de archivos enel directorio actual.
$! -., Obviamente, da el identificador de proceso del último proceso / corriente