diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2021-12-31 23:26:59 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2021-12-31 23:26:59 +0000 |
commit | 2025214dfcc46ac16cb93abc05b344330987b339 (patch) | |
tree | d121ec515b81006a5272bc1c7fadf93fb4cf4392 /sys/src/cmd/rc/code.c | |
parent | d0c9127b10251d85b56eba00bc586b57dd998aaf (diff) |
rc: fix here document handling with quoted end-marker (thanks sigrid)
when end marker is quoted, we should not substitute.
also, pcmd() needs to print the end marker without quotes.
Diffstat (limited to 'sys/src/cmd/rc/code.c')
-rw-r--r-- | sys/src/cmd/rc/code.c | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/sys/src/cmd/rc/code.c b/sys/src/cmd/rc/code.c index 67c2eb925..f39b3a573 100644 --- a/sys/src/cmd/rc/code.c +++ b/sys/src/cmd/rc/code.c @@ -353,14 +353,10 @@ outcode(tree *t, int eflag) stuffdot(p); break; case REDIR: - emitf(Xmark); - if(t->rtype==HERE){ - /* replace end marker with mktmep() pattern */ - free(c0->str); - c0->str=estrdup("/tmp/here.XXXXXXXXXXX"); - c0->glob=0; + if(t->rtype!=HERE){ + emitf(Xmark); + outcode(c0, eflag); } - outcode(c0, eflag); switch(t->rtype){ case APPEND: emitf(Xappend); @@ -375,7 +371,7 @@ outcode(tree *t, int eflag) emitf(Xrdwr); break; case HERE: - emitf(Xhere); + emitf(c0->quoted?Xhereq:Xhere); emits(t->str); t->str=0; /* passed ownership */ break; @@ -539,7 +535,7 @@ codefree(code *cp) || p->f==Xsubshell || p->f==Xtrue) p++; else if(p->f==Xdup || p->f==Xpipefd) p+=2; else if(p->f==Xpipe) p+=4; - else if(p->f==Xhere) free(p[1].s), p+=2; + else if(p->f==Xhere || p->f==Xhereq) free(p[1].s), p+=2; else if(p->f==Xword) free((++p)->s); else if(p->f==Xfn){ free(p[2].s); |