Date: Sat, 21 May 2011 22:03:06 +0000 (UTC) From: Jilles Tjoelker <jilles@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r222165 - in head: bin/sh tools/regression/bin/sh/parser Message-ID: <201105212203.p4LM362v047158@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jilles Date: Sat May 21 22:03:06 2011 New Revision: 222165 URL: http://svn.freebsd.org/changeset/base/222165 Log: sh: Expand aliases after assignments and redirections. Added: head/tools/regression/bin/sh/parser/alias4.0 (contents, props changed) head/tools/regression/bin/sh/parser/alias5.0 (contents, props changed) Modified: head/bin/sh/eval.c head/bin/sh/parser.c head/bin/sh/parser.h head/bin/sh/sh.1 Modified: head/bin/sh/eval.c ============================================================================== --- head/bin/sh/eval.c Sat May 21 20:21:20 2011 (r222164) +++ head/bin/sh/eval.c Sat May 21 22:03:06 2011 (r222165) @@ -714,15 +714,9 @@ evalcommand(union node *cmd, int flags, oexitstatus = exitstatus; exitstatus = 0; for (argp = cmd->ncmd.args ; argp ; argp = argp->narg.next) { - char *p = argp->narg.text; - if (varflag && is_name(*p)) { - do { - p++; - } while (is_in_name(*p)); - if (*p == '=') { - expandarg(argp, &varlist, EXP_VARTILDE); - continue; - } + if (varflag && isassignment(argp->narg.text)) { + expandarg(argp, &varlist, EXP_VARTILDE); + continue; } expandarg(argp, &arglist, EXP_FULL | EXP_TILDE); varflag = 0; Modified: head/bin/sh/parser.c ============================================================================== --- head/bin/sh/parser.c Sat May 21 20:21:20 2011 (r222164) +++ head/bin/sh/parser.c Sat May 21 22:03:06 2011 (r222165) @@ -619,6 +619,7 @@ simplecmd(union node **rpp, union node * union node **orig_rpp = rpp; union node *n = NULL; int special; + int savecheckkwd; /* If we don't have any redirections already, then we must reset */ /* rpp to be the address of the local redir variable. */ @@ -634,7 +635,10 @@ simplecmd(union node **rpp, union node * */ orig_rpp = rpp; + savecheckkwd = CHKALIAS; + for (;;) { + checkkwd = savecheckkwd; if (readtoken() == TWORD) { n = (union node *)stalloc(sizeof (struct narg)); n->type = NARG; @@ -642,6 +646,8 @@ simplecmd(union node **rpp, union node * n->narg.backquote = backquotelist; *app = n; app = &n->narg.next; + if (savecheckkwd != 0 && !isassignment(wordtext)) + savecheckkwd = 0; } else if (lasttoken == TREDIR) { *rpp = n = redirnode; rpp = &n->nfile.next; @@ -1859,6 +1865,22 @@ goodname(const char *name) } +int +isassignment(const char *p) +{ + if (!is_name(*p)) + return 0; + p++; + for (;;) { + if (*p == '=') + return 1; + else if (!is_in_name(*p)) + return 0; + p++; + } +} + + /* * Called when an unexpected token is read during the parse. The argument * is the token that is expected, or -1 if more than one type of token can Modified: head/bin/sh/parser.h ============================================================================== --- head/bin/sh/parser.h Sat May 21 20:21:20 2011 (r222164) +++ head/bin/sh/parser.h Sat May 21 22:03:06 2011 (r222165) @@ -80,4 +80,5 @@ extern const char *const parsekwd[]; union node *parsecmd(int); void fixredir(union node *, const char *, int); int goodname(const char *); +int isassignment(const char *); char *getprompt(void *); Modified: head/bin/sh/sh.1 ============================================================================== --- head/bin/sh/sh.1 Sat May 21 20:21:20 2011 (r222164) +++ head/bin/sh/sh.1 Sat May 21 22:03:06 2011 (r222165) @@ -32,7 +32,7 @@ .\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95 .\" $FreeBSD$ .\" -.Dd May 20, 2011 +.Dd May 21, 2011 .Dt SH 1 .Os .Sh NAME @@ -506,8 +506,8 @@ The following are keywords: An alias is a name and corresponding value set using the .Ic alias built-in command. -Whenever a keyword may occur (see above), -and after checking for keywords, the shell +Wherever the command word of a simple command may occur, +and after checking for keywords if a keyword may occur, the shell checks the word to see if it matches an alias. If it does, it replaces it in the input stream with its value. For example, if there is an alias called Added: head/tools/regression/bin/sh/parser/alias4.0 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/tools/regression/bin/sh/parser/alias4.0 Sat May 21 22:03:06 2011 (r222165) @@ -0,0 +1,5 @@ +# $FreeBSD$ + +alias alias0=exit +eval 'x=1 alias0 0' +exit 1 Added: head/tools/regression/bin/sh/parser/alias5.0 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/tools/regression/bin/sh/parser/alias5.0 Sat May 21 22:03:06 2011 (r222165) @@ -0,0 +1,5 @@ +# $FreeBSD$ + +alias alias0=exit +eval '</dev/null alias0 0' +exit 1
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201105212203.p4LM362v047158>