aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
Diffstat (limited to 'shell')
-rw-r--r--shell/ash.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 216780c9d..f0729ed4d 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -2418,9 +2418,23 @@ static void evalcommand(union node *cmd, int flags)
for (argp = cmd->ncmd.assign; argp; argp = argp->narg.next) {
expandarg(argp, &varlist, EXP_VARTILDE);
}
- for (argp = cmd->ncmd.args; argp; argp = argp->narg.next) {
+ for (argp = cmd->ncmd.args; argp && !arglist.list; argp = argp->narg.next) {
expandarg(argp, &arglist, EXP_FULL | EXP_TILDE);
}
+ if (argp) {
+ struct builtincmd *bcmd;
+ int pseudovarflag;
+
+ bcmd = find_builtin(arglist.list->text);
+ pseudovarflag = bcmd && IS_BUILTIN_ASSIGN(bcmd);
+ for (; argp; argp = argp->narg.next) {
+ if (pseudovarflag && isassignment(argp->narg.text)) {
+ expandarg(argp, &arglist, EXP_VARTILDE);
+ continue;
+ }
+ expandarg(argp, &arglist, EXP_FULL | EXP_TILDE);
+ }
+ }
*arglist.lastp = NULL;
*varlist.lastp = NULL;
expredir(cmd->ncmd.redirect);