Hier ist ein Shell-Skript:Bash: Zuwachs globaler Variable
globvar=0
function myfunc {
let globvar=globvar+1
echo "myfunc: $globvar"
}
myfunc
echo "something" | myfunc
echo "Global: $globvar"
Wenn sie aufgerufen wird, druckt es aus dem folgenden:
$ 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
Die Frage ist: warum dies geschieht und welches Verhalten ist richtig?
P.S. Ich habe das seltsame Gefühl, dass die Funktion hinter der Pipe in einer gegabelten Shell aufgerufen wird ... Kann es also einen einfachen Workaround geben?
P.P.S. Diese Funktion ist ein einfacher Test-Wrapper. Es führt eine Testanwendung aus und analysiert seine Ausgabe. Dann werden die Variablen $ PASSED oder $ FAILED erhöht. Schließlich erhalten Sie eine Anzahl von bestandenen/fehlgeschlagenen Tests in globalen Variablen. Die Nutzung ist wie:
test-util << EOF | myfunc
input for test #1
EOF
test-util << EOF | myfunc
input for test #2
EOF
echo "Passed: $PASSED, failed: $FAILED"
Danke, Serge
Haben Sie gelesen: http://tldp.org/LDP/abs/html/localvar.html? –
Nun, meiner Meinung nach $ globvar ist keine lokale Variable, weil das Aufrufen von myfunc() ohne eine Pipe die globale Variable $ globvar ziemlich gut erhöht. Das Problem ist, dass der Aufruf von Funktion über Pipe in bash/sh nicht funktioniert. – zserge