A variável shell não muda com a combinação pipe-while-read

5

Considere o caso 1:

$ COUNT=0 ; while [ $COUNT -ne 3  ]; do echo $COUNT; COUNT=$(expr $COUNT + 1 );done
0
1
2
$ echo $COUNT
3

Até o final da variável COUNT do loop é 3, como esperado

Considere o caso 2:

$ COUNT=1; find . -print0 | while IFS= read -r -d '' FILE; do echo "$FILE"; expr $COUNT + 1; COUNT=$(expr $COUNT + 1 )  ;done 
.
2
./file name
3
./file
4
./a
b
5
$ echo $COUNT
1

Como você pode ver, neste caso, COUNT permaneceu o mesmo. Por quê ? Pode ser visto que está mudando dentro do loop while, mas não uma vez fora do loop.

O que exatamente eu estou sentindo falta aqui?

    
por Sergiy Kolodyazhnyy 30.11.2015 / 10:05

1 resposta

6

No seu primeiro caso, todos os comandos executados no mesmo shell. O conteúdo de COUNT foi alterado.

No segundo caso, uma subshell é iniciada com o encadeamento | e as alterações na subshell não surtem efeito no shell atual. Mas o subshell conhece a variável COUNT e a primeira saída é 2 .

    
por A.B. 30.11.2015 / 10:12