Incrémenter une variable globale dans Bash

Voici un script shell:

globvar=0

function myfunc {
  let globvar=globvar+1
  echo "myfunc: $globvar"
}

myfunc
echo "something" | myfunc

echo "Global: $globvar"

Lorsqu'il est appelé, il imprime le suivant:

$ sh zzz.sh
myfunc: 1
myfunc: 2
Global: 1
$ bash zzz.sh
myfunc: 1
myfunc: 2
Global: 1
$ zsh zzz.sh
myfunc: 1
myfunc: 2
Global: 2

La question est: pourquoi ce qui se passe et ce comportement est correct?

P. S. j'ai l'étrange impression que la fonction derrière la pipe est appelée dans une fourche shell... Donc, peut-il y avoir une solution simple?

P. P. S. Cette fonction est un simple test wrapper. Il s'exécute en application de test et d'analyse de sa sortie. Puis il incrémente $PASSÉ ou $a ÉCHOUÉ variables. Enfin, vous obtenez un certain nombre de réussi/échoué des tests dans des variables globales. L'utilisation est comme:

test-util << EOF | myfunc
input for test #1
EOF
test-util << EOF | myfunc
input for test #2
EOF
echo "Passed: $PASSED, failed: $FAILED"
Avez-vous lu: tldp.org/LDP/abs/html/localvar.html ?
eh bien, à mon avis $globvar n'est pas une variable locale, parce que l'appel de mafonction() sans tuyau incrémente la variable globale $globvar assez bien. Le problème, c'est que l'appel de la fonction sur la pipe ne fonctionne pas en bash/sh.

OriginalL'auteur zserge | 2010-11-23