diff options
author | jilles <jilles@FreeBSD.org> | 2009-06-23 22:53:34 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2009-06-23 22:53:34 +0000 |
commit | 3e00d0029ad8885cc6209293016ac09f816415ec (patch) | |
tree | 2cf0c57efdd587343b50c8f9f6389056f59789cb /bin | |
parent | 5bc3a65e406b90cd9e2a47b79117e453bdb56413 (diff) | |
download | FreeBSD-src-3e00d0029ad8885cc6209293016ac09f816415ec.zip FreeBSD-src-3e00d0029ad8885cc6209293016ac09f816415ec.tar.gz |
Quote -x tracing output so it is unambiguous.
It is usually but not always suitable for re-input to the shell.
Approved by: ed (mentor) (implicit)
Diffstat (limited to 'bin')
-rw-r--r-- | bin/sh/eval.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/bin/sh/eval.c b/bin/sh/eval.c index c0b2096..39e1660 100644 --- a/bin/sh/eval.c +++ b/bin/sh/eval.c @@ -642,17 +642,32 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd) /* Print the command if xflag is set. */ if (xflag) { char sep = 0; + const char *p; out2str(ps4val()); for (sp = varlist.list ; sp ; sp = sp->next) { if (sep != 0) outc(' ', &errout); - out2str(sp->text); + p = sp->text; + while (*p != '=' && *p != '\0') + out2c(*p++); + if (*p != '\0') { + out2c(*p++); + out2qstr(p); + } sep = ' '; } for (sp = arglist.list ; sp ; sp = sp->next) { if (sep != 0) outc(' ', &errout); - out2str(sp->text); + /* Disambiguate command looking like assignment. */ + if (sp == arglist.list && + strchr(sp->text, '=') != NULL && + strchr(sp->text, '\'') == NULL) { + out2c('\''); + out2str(sp->text); + out2c('\''); + } else + out2qstr(sp->text); sep = ' '; } outc('\n', &errout); |