On Wed, 12 Feb 2003, Dorian Bolivar wrote:

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Ol�,
>
> On Wednesday, 12 February 2003 18:00, Paulino Kenji Sato wrote:
> > Considere o seguinte bash script:
> > #!/bin/bash
> > CONTADOR=0
> > find $1 -name "*.jpg" | while read f; do
> >    #faz um monte de coisas aqui
> >    CONTADOR=$[ $CONTADOR + 1 ]
> > done
> > echo "N�mero de arquivos processados: $CONTADOR"
> >
> > Ao executar esse script, o $CONTADOR sempre esta com o valor inicial
> > 0. Eu sei por que isso acontece, o pipe abre uma nova shell.
> > Como fazer para ter o valor atualizado do $CONTADOR?
>
> Se eu entendi +/- o problema, pergunto: voc� j� experimentou exportar a
> vari�vel para o ambiente, tanto na declara��o quanto na atualiza��o?

Sim, olha
(1)
#!/bin/bash
C=0
export C
head -1 /etc/passwd |  while read f; do
   echo $f
   C=$f
   export C
done
echo "C = $C"

$ ./x
root:x:0:0:root:/root:/bin/bash
C = 0

agora se fa�o
(2)
#!/bin/bash
C=0
export C
head -1 /etc/passwd | ( while read f; do
   echo $f
   C=$f
   export C
done
echo "C = $C" )

$ ./x
root:x:0:0:root:/root:/bin/bash
C = root:x:0:0:root:/root:/bin/bash

Explica��o: (pelo que entendi)
No (1) o pipe (|) abre uma nova shell, e herda as variaveis, mas
n�o consegue devolver o que herdou ao seu ascendente.

No caso (2) tambem cria uma nova shell, mas o par () e usando para agrupar
os comandos, todo o resto da execu��o ocorreu no shell filho. O pai come�a
o servi�o e deixa para o filho terminar.

Um "scripteiro" casual como eu n�o lembra de usar o () para agrupar,
mesmo tendo o livro de bash a m�o. :)


Assinantes em 12/02/2003: 2246
Mensagens recebidas desde 07/01/1999: 201024
Historico e [des]cadastramento: http://linux-br.conectiva.com.br
Assuntos administrativos e problemas com a lista:
            mailto:[EMAIL PROTECTED]

Responder a