diff options
author | jilles <jilles@FreeBSD.org> | 2010-09-11 14:15:50 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2010-09-11 14:15:50 +0000 |
commit | 694b7e6c3713db74cbd3cd49f1e718b36a0691ec (patch) | |
tree | 3fb69cb9bb788d82bbb1fcbaa235e19c821fbd7d | |
parent | 107ea66c07f4e9862fd2961da07c078eab84d05f (diff) | |
download | FreeBSD-src-694b7e6c3713db74cbd3cd49f1e718b36a0691ec.zip FreeBSD-src-694b7e6c3713db74cbd3cd49f1e718b36a0691ec.tar.gz |
sh: Apply variable assignments left-to-right in bltinlookup().
Example:
HOME=foo HOME=bar cd
-rw-r--r-- | bin/sh/var.c | 6 | ||||
-rw-r--r-- | tools/regression/bin/sh/execution/var-assign1.0 | 3 |
2 files changed, 8 insertions, 1 deletions
diff --git a/bin/sh/var.c b/bin/sh/var.c index 6f4acae..8ff6426 100644 --- a/bin/sh/var.c +++ b/bin/sh/var.c @@ -431,11 +431,15 @@ bltinlookup(const char *name, int doall) { struct strlist *sp; struct var *v; + char *result; + result = NULL; for (sp = cmdenviron ; sp ; sp = sp->next) { if (varequal(sp->text, name)) - return strchr(sp->text, '=') + 1; + result = strchr(sp->text, '=') + 1; } + if (result != NULL) + return result; for (v = *hashvar(name) ; v ; v = v->next) { if (varequal(v->text, name)) { if ((v->flags & VUNSET) diff --git a/tools/regression/bin/sh/execution/var-assign1.0 b/tools/regression/bin/sh/execution/var-assign1.0 new file mode 100644 index 0000000..26e5424 --- /dev/null +++ b/tools/regression/bin/sh/execution/var-assign1.0 @@ -0,0 +1,3 @@ +# $FreeBSD$ + +[ "$(HOME=/etc HOME=/ cd && pwd)" = / ] |