Post by Marcel LogenWie kann man sich dieses unterschiedliche Verhalten erklären?
(bash)
| 45 5
| 46 6
| 47 7
| 48 8
| 49 9
| 10
| 10
| 45 5
| 46 6
| 47 7
| 48 8
| 49 9
| 5
| 5
Ich komme leider irgendwie nicht dahinter.
Das ist beliebter Stolperstein: Jeder Bestandteil einer
Pipeline wird in einer eigenen Subshell ausgeführt
(https://www.gnu.org/software/bash/manual/bash.html#Pipelines):
| […]
| Each command in a multi-command pipeline, where pipes are
| created, is executed in its own subshell, which is a sepa-
| rate process (see Command Execution Environment). If the
| lastpipe option is enabled using the shopt builtin (see The
| Shopt Builtin), the last element of a pipeline may be run by
| the shell process when job control is not active.
| […]
Das heißt, in der ersten Variante gibt es nur eine „Instanz“
der Variablen var und var2, in der zweiten existieren diese
jeweils separat in der Subshell, die durch die äußeren „()“
gestartet wird, dann in der Subshell, die „echo“ ausgeführt,
und zuletzt in der Subshell, die die while-Schleife aus-
führt.
Man kann das normalerweise umgehen, indem man keine Pipe-
lines, sondern beispielsweise process substitutions nutzt:
| $ ( var=44 ; var2=5 ; { while read -r ; do echo "$((++var)) $((var2++))" ; done < <(echo -e '0\n1\n2\n3\n4') ; echo "$var2" ; } ; echo "$var2" )
| 45 5
| 46 6
| 47 7
| 48 8
| 49 9
| 10
| 10
| $
Tim