[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] variavel no contexto
From: |
Felipe Kellermann |
Subject: |
Re: [shell-script] variavel no contexto |
Date: |
Tue, 21 Feb 2006 23:11:30 -0300 (BRT) |
User-agent: |
Pine <http://www.washington.edu/pine/> |
On Tue, 21 Feb 2006 9:57pm -0300, Tiago Barcellos Peczenyj wrote:
> Vejamos
>
> $ x=1 ; x=2 echo $x ; echo $x
> 1
> 1
No primeiro comando, x = 1.
No segundo comando:
As substituicoes simples (glob, parametros, etc) sao feitas.
Resultado: "x=2 echo 1" (x = 1, do comando anterior) -- no ambiente
shell de chamada ao echo, parametro x = 2.
No segundo comando:
As substituicoes simples (glob, parametros, etc) sao feitas.
Resultado: "echo 1" (x = 2 estava no ambiente shell do echo).
Resultado:
1
1
> $ lala() { echo $x ; }
>
Tudo que estiver dentro do {} vai estar em outro ambiente shell.
Posso alterar (estou "criando ele) ele externamente como quiser.
Outro comportamento similar, com redirecionamento:
$ lala() { cat; } < <(hostname)
$ printf "saida\n" | lala
saida
$ lala
orchid
> $ x=1 ; x=2 lala ; echo $x
> 2
> 1
No primeiro comando, x = 1 (ambiente shell atual).
No segundo comando:
As substituicoes simples (glob, parametros, etc) sao feitas.
Resultado: x=2 lala (x = 2 para o novo ambiente de lala).
No ambiente de lala, x = 2, e "echo $x" traduz em "echo 2".
No terceiro comando:
No ambiente atual, x = 1 -- lala ja acabou.
Resultado: echo 1 (x = 1 do ambiente atual).
> Parece que a variavel de contexto só pode ser acessada internamente, não
> de forma explicita. Estou muito enganado ?
Variaveis (parametros) sao acessadas de forma diferente dependendo do
ambiente em que estao sendo referenciadas. Para isto existem parametros
locais e globais. OBS: Ambiente shell nao tem a ver exatamente com o
ambiente tradicional, aquela lista de chave-valor de um processo.
$ lala() { x=2; }
$ x=1; lala; echo $x
2
$ lala() { local x=2; }
$ x=1; lala; echo $x
1
(Poderia ser tanto local quanto declare, typeset, ou qualquer outro tipo
de modificador com qualquer opcao -- tu vai estar criando um parametro
novo e "escondendo" o mais proximo).
$ lala() { local x=3; toto; echo $x; }
$ toto() { local x=2; echo $x; }
$ x=1; echo $x; lala; echo $x
1
2
3
1
Teu exemplo da chamada de um outro script nao muda. Alem de estar em outro
ambiente, tu vai estar em outro shell que nao tem relacao nenhum com quem
chamou/criou ele. Uma "variavel de ambiente" (processo) foi explicitamente
especificada para o processo (script, shell) seguinte, no entanto, e assim
pode ser utilizada.
$ x=1; x=2 sh -c 'echo $x'; echo $x
2
1
OBS: Ha outros shells que se confundem na troca de ambientes shell e tu
vai ter nao raramente resultados como este:
$ lala() { echo $x; }
$ x=1; x=2 lala; echo $x
2
2
A zsh, por exemplo, tem alguns modificadores de parametros (variaveis) que
podem ser usados para modificar e trabalhar com estes comportamentos, como
o "hide", por exemplo. Como referencia de leitura (para o assunto de
locais e ambiente shell) eu recomendaria a "LOCAL PARAMETERS" do manual
deste shell (zshparam, pagina 7).
--
Felipe Kellermann