diff options
-rw-r--r-- | sys/man/1/rc | 4 | ||||
-rw-r--r-- | sys/src/cmd/rc/code.c | 12 | ||||
-rw-r--r-- | sys/src/cmd/rc/exec.c | 2 | ||||
-rw-r--r-- | sys/src/cmd/rc/havefork.c | 6 | ||||
-rw-r--r-- | sys/src/cmd/rc/pcmd.c | 2 | ||||
-rw-r--r-- | sys/src/cmd/rc/syn.y | 3 |
6 files changed, 23 insertions, 6 deletions
diff --git a/sys/man/1/rc b/sys/man/1/rc index 29cfd94b5..2b12cf0f7 100644 --- a/sys/man/1/rc +++ b/sys/man/1/rc @@ -233,6 +233,8 @@ The value is a single string containing the components of the named variable separated by spaces. A variable with zero elements yields the empty string. .HP .BI `{ command } +.HP +.BI ` "split " { command } .br .I rc executes the @@ -245,6 +247,8 @@ If .B $ifs is not otherwise set, its value is .BR "'\ \et\en'" . +In the second form of the command, split is used instead of +.BR $ifs . .HP .BI <{ command } .HP diff --git a/sys/src/cmd/rc/code.c b/sys/src/cmd/rc/code.c index 9ec637988..927273275 100644 --- a/sys/src/cmd/rc/code.c +++ b/sys/src/cmd/rc/code.c @@ -125,9 +125,19 @@ outcode(tree *t, int eflag) emitf(Xconc); break; case '`': + emitf(Xmark); + if(c0){ + outcode(c0, 0); + emitf(Xglob); + } else { + emitf(Xmark); + emitf(Xword); + emits(estrdup("ifs")); + emitf(Xdol); + } emitf(Xbackq); p = emiti(0); - outcode(c0, 0); + outcode(c1, 0); emitf(Xexit); stuffdot(p); break; diff --git a/sys/src/cmd/rc/exec.c b/sys/src/cmd/rc/exec.c index dd194db87..10cb76935 100644 --- a/sys/src/cmd/rc/exec.c +++ b/sys/src/cmd/rc/exec.c @@ -208,7 +208,7 @@ main(int argc, char *argv[]) * Xappend(file)[fd] open file to append * Xassign(name, val) assign val to name * Xasync{... Xexit} make thread for {}, no wait - * Xbackq{... Xreturn} make thread for {}, push stdout + * Xbackq(split){... Xreturn} make thread for {}, push stdout * Xbang complement condition * Xcase(pat, value){...} exec code on match, leave (value) on * stack diff --git a/sys/src/cmd/rc/havefork.c b/sys/src/cmd/rc/havefork.c index 7f359423b..ad5a80298 100644 --- a/sys/src/cmd/rc/havefork.c +++ b/sys/src/cmd/rc/havefork.c @@ -85,10 +85,11 @@ Xbackq(void) int pfd[2]; char *s, *wd, *ewd, *stop; struct io *f; - var *ifs = vlook("ifs"); word *v, *nextv; - stop = ifs->val? ifs->val->word: ""; + stop = ""; + if(runq->argv && runq->argv->words) + stop = runq->argv->words->word; if(pipe(pfd)<0){ Xerror("can't make pipe"); return; @@ -135,6 +136,7 @@ Xbackq(void) free(wd); closeio(f); Waitfor(pid, 0); + poplist(); /* ditch split in "stop" */ /* v points to reversed arglist -- reverse it onto argv */ while(v){ nextv = v->next; diff --git a/sys/src/cmd/rc/pcmd.c b/sys/src/cmd/rc/pcmd.c index 8caf60a28..889892370 100644 --- a/sys/src/cmd/rc/pcmd.c +++ b/sys/src/cmd/rc/pcmd.c @@ -32,7 +32,7 @@ pcmd(io *f, tree *t) break; case '^': pfmt(f, "%t^%t", c0, c1); break; - case '`': pfmt(f, "`%t", c0); + case '`': pfmt(f, "`%t%t", c0, c1); break; case ANDAND: pfmt(f, "%t && %t", c0, c1); break; diff --git a/sys/src/cmd/rc/syn.y b/sys/src/cmd/rc/syn.y index c7de35313..051c9e88e 100644 --- a/sys/src/cmd/rc/syn.y +++ b/sys/src/cmd/rc/syn.y @@ -83,7 +83,8 @@ comword: '$' word {$$=tree1('$', $2);} | '"' word {$$=tree1('"', $2);} | COUNT word {$$=tree1(COUNT, $2);} | WORD -| '`' brace {$$=tree1('`', $2);} +| '`' brace {$$=tree2('`', (struct tree*)0, $2);} +| '`' word brace {$$=tree2('`', $2, $3);} | '(' words ')' {$$=tree1(PAREN, $2);} | REDIR brace {$$=mung1($1, $2); $$->type=PIPEFD;} keyword: FOR|IN|WHILE|IF|NOT|TWIDDLE|BANG|SUBSHELL|SWITCH|FN |