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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] variável some


From: Claudio Sá de Abreu
Subject: Re: [shell-script] variável some
Date: Tue, 12 Jul 2005 17:04:54 -0300
User-agent: Mozilla Thunderbird 1.0.2 (Macintosh/20050317)

Obrigado Eliphas. Finalmente aprendi a usar um named pipe. Até hoje eu não tinha precisado dele.

[]'s
Claudio

Eliphas Levy Theodoro wrote:

Claudio Sá de Abreu escreveu:
[...]
O problema é o seguinte: O último "echo $_cont", que está fora do while, imprime o valor "10", ou seja, é como se a variável _cont dentro do while estivesse "protegida".
[...]
Já usei export $_cont dentro do while, mas não adiantou. Alguém sabe como faço para as modificações de dentro do while irem para fora?

Essa não é nova. Quando você usa um pipe para redirecionar para outro comando, você na verdade está abrindo uma nova instância do shell, e essa nova instância não compartilha *para escrita* as variáveis de ambiente do shell superior.

$ cat y
um
dois
tres

$ cat x
#!/bin/bash
c=0
cat y | while read line; do let c++; echo -n "$c "; done; echo $c
while read line; do let c++; echo -n "$c "; done < y; echo $c

$ ./x
1 2 3 0
1 2 3 3

O segundo while é parte do mesmo shell que criou a variável, o primeiro é uma "cópia". Assim que ele acaba (no done), tudo que está dentro dele faz *puf*.
Por isso que o segundo não altera as variáveis do primeiro.

Você pode usar redirecionamentos, como eu fiz no exemplo, ou se não é simplesmente um arquivo que vai ser redirecionado, mas a saída de outro comando, outros xunxos como named pipes ou substituição de processos:

http://www.tldp.org/LDP/abs/html/contributed-scripts.html#FIFO
named pipe:
$ mkfifo pipe
$ sed 's/foo/bar/' arquivo > pipe &
$ while read line; do ...; done < pipe
$ rm pipe

http://www.tldp.org/LDP/abs/html/process-sub.html
process substitution:
$ while read line; do ...; done < <(sed 's/foo/bar/' arquivo)



reply via email to

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