Hier nochmal ein minimaleres Beispiel in der mksh:
Code: Alles auswählen
:-/ v=hello
:-/ v=X echo bar
bar
:-/ echo $v
hello
:-/ v=X eval echo bar
bar
:-/ echo $v
X
Vielleicht liegt es am `eval', das ein Special Builtin ist.
Aha, auch bei einem anderen Special Builtin funktioniert es so:
Code: Alles auswählen
:-/ v=hello
:-/ v=X times
0m00.00s 0m00.01s
0m00.51s 0m00.02s
:-/ echo $v
X
Und -- Aha! -- wenn man genau in der Manpage nachliest findet man dort auch die Antwort darauf:
Manpage mksh(1) hat geschrieben:
Spe-
cial built-in commands differ from other commands in that the PATH param-
eter is not used to find them, an error during their execution can cause
a non-interactive shell to exit, and parameter assignments that are spec-
ified before the command are kept after the command completes.
Und -- Tada! -- wenn ich die Bash im POSIX-Mode verwende, dann klappt es dort auch:
Code: Alles auswählen
:-/ ps |grep $$
65194 24 S 0:00.00 bash --posix
:-/ v=hello
:-/ v=X eval echo bar
bar
:-/ echo $v
X
Und weiss man dann wo man in POSIX hinschauen muss, dann findet man die entsprechende Stelle auch:
Damit waere dieses Raetsel geloest. Und es zeigt sich mal wieder: In der Shell ist alles halt so wie es nunmal ist und nicht unbedingt logisch. Sehr vieles sind einfach Zufaelle der ersten Implementierungen (die weniger strukturiert waren als spaetere Sprachen), die fortan gleich bleiben muessen, damit alles kompatibel ist.