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 --------------------------------------------------------------------- Esta lista não admite a abordagem de outras liguagens de programação, como perl, C etc. Quem insistir em não seguir esta regra será moderado sem prévio aviso. --------------------------------------------------------------------- Sair da lista: [EMAIL PROTECTED] --------------------------------------------------------------------- Esta lista é moderada de acordo com o previsto em http://www.listas-discussao.cjb.net --------------------------------------------------------------------- Servidor Newsgroup da lista: news.gmane.org Grupo: gmane.org.user-groups.programming.shell.brazil Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/shell-script/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html