shell-script-pt
[Top][All Lists]
Advanced

[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


reply via email to

[Prev in Thread] Current Thread [Next in Thread]