* SUCH DAMAGE.
*
* @(#)eval.c 8.9 (Berkeley) 6/8/95
- * $FreeBSD: src/bin/sh/eval.c,v 1.104 2011/05/15 17:00:43 jilles Exp $
+ * $FreeBSD: src/bin/sh/eval.c,v 1.105 2011/05/21 22:03:06 jilles Exp $
*/
#include <sys/time.h>
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;
* SUCH DAMAGE.
*
* @(#)parser.c 8.7 (Berkeley) 5/16/95
- * $FreeBSD: src/bin/sh/parser.c,v 1.111 2011/05/20 16:03:36 jilles Exp $
+ * $FreeBSD: src/bin/sh/parser.c,v 1.112 2011/05/21 22:03:06 jilles Exp $
*/
#include <stdio.h>
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. */
*/
orig_rpp = rpp;
+ savecheckkwd = CHKALIAS;
+
for (;;) {
+ checkkwd = savecheckkwd;
if (readtoken() == TWORD) {
n = (union node *)stalloc(sizeof (struct narg));
n->type = NARG;
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;
}
+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
* SUCH DAMAGE.
*
* @(#)parser.h 8.3 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/parser.h,v 1.16 2011/05/06 20:45:50 jilles Exp $
+ * $FreeBSD: src/bin/sh/parser.h,v 1.17 2011/05/21 22:03:06 jilles Exp $
*/
/* control characters in argument strings */
union node *parsecmd(int);
void fixredir(union node *, const char *, int);
int goodname(const char *);
+int isassignment(const char *);
const char *getprompt(void *);
.\" SUCH DAMAGE.
.\"
.\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95
-.\" $FreeBSD: src/bin/sh/sh.1,v 1.164 2011/05/20 22:55:18 jilles Exp $
+.\" $FreeBSD: src/bin/sh/sh.1,v 1.165 2011/05/21 22:03:06 jilles Exp $
.\"
-.Dd July 4, 2011
+.Dd August 21, 2011
.Dt SH 1
.Os
.Sh NAME
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
--- /dev/null
+# $FreeBSD: src/tools/regression/bin/sh/parser/alias4.0,v 1.1 2011/05/21 22:03:06 jilles Exp $
+
+alias alias0=exit
+eval 'x=1 alias0 0'
+exit 1
--- /dev/null
+# $FreeBSD: src/tools/regression/bin/sh/parser/alias5.0,v 1.1 2011/05/21 22:03:06 jilles Exp $
+
+alias alias0=exit
+eval '</dev/null alias0 0'
+exit 1