Pergunta

Qual é o significado por US $! em shell ou shell script? Eu estou tentando entender um script que tem a algo como o seguinte.

local@usr> a=1
local@usr> echo $a
1
local@usr> echo $!a
a

É a impressão do verso variável. É tudo por isso? Quais são as outras opções $ x que temos? Alguns que eu conheço são $$, $ *, $ ?. Se alguém pode me apontar para uma boa fonte, será útil. BTW, esta é em Sun OS 5.8, KSH.

Foi útil?

Solução

As diversas variáveis ??$… estão descritos no manual do Bash . De acordo com os expande $! manuais para o PID do último processo lançado em background. Veja:

$ echo "Foo"
Foo
$ echo $!

$ true&
[1] 67064
$ echo $!
67064
[1]+  Done                    true

Em ksh parece fazer o mesmo.

Outras dicas

A partir da página homem ksh no meu 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 o shell que você está pedindo, ksh, utilize o o ksh Manual e leia isto:

Parâmetro Substituição
Um parâmetro é um identificador, um ou mais dígitos, ou qualquer um dos os caracteres *, @, #, -?!., $ e

É claro que essas são as opções aceitas $ *, $ @, $ #, $ ?, $ -, $$ e $ !.
Mais poderia ser incluído no futuro.


Para o parâmetro $ !, do manual:

"!" O número do processo do último comando fundo invocado.

Se você iniciar um processo de fundo, como sleep 60 &, em seguida, haverá um número de processo para tal processo, eo parâmetro $! imprimirá seu número.

$ sleep 60 &
[1] 12329
$ echo "$!"
12329

Se não houver um processo em segundo plano em execução (como quando o shell é iniciado), o exansion está vazio. Ele tem um valor nulo.

$ ksh -c 'echo $!'

Se houver um processo de fundo, ele vai expandir-se para o PID desse processo:

$  ksh -c 'sleep 30 & echo $!'
42586

É por isso que echo $!a expandido para a. É porque não há PID com o relatório:

$  ksh -c 'echo $!a'
a

Outros conchas pode ter uma diferente lista (geralmente muito similar) de expansões (um parâmetro com apenas um $ e um próximo caractere).
Por exemplo, o bash reconhecer este *@#?-$!0_ como "parâmetros especiais". Pesquisar manual do Bash para o título "3.4.2 Parâmetros especial".

Parâmetros especiais
O shell trata vários parâmetros especialmente.

Ela dá o processo de identificação da última backgroundjob ou função fundo Por favor, vá através deste link abaixo

http://www.well.ox.ac.uk/~johnb/comp/unix/ksh.html#specvar

! é um operador de referência no unix, embora ele não é chamado com esse nome.

Ele sempre se refere a um processo mãe. Tente digitar:! no vi, você leva para prompt de comando e você pode executar comandos, como de costume até que o comando de saída.

! em SQLPLUS também executa o comando do prompt de comando. tente isso em sqlplus

SQL>! Ls --- isto dá a lista de arquivos Inthe dir atual.

$! - obviamente, dá o ID do processo do processo mais recente / atual

.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top