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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top