diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2004-06-28 15:38:10 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2004-06-28 15:38:10 +0000 |
commit | 7f26993e99cccf2d56958643b8eb369625f04726 (patch) | |
tree | 5523268c14d2d86b41b842be5737a167f181f93a | |
parent | 81d27b662a4e65665f8cfb41a629a92181769506 (diff) | |
download | zsh-7f26993e99cccf2d56958643b8eb369625f04726.tar.gz zsh-7f26993e99cccf2d56958643b8eb369625f04726.tar.xz zsh-7f26993e99cccf2d56958643b8eb369625f04726.zip |
20112 changed c.f. 20113:
fix here string and here document expansion and quoting
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | Doc/Zsh/redirect.yo | 10 | ||||
-rw-r--r-- | Src/exec.c | 3 | ||||
-rw-r--r-- | Src/parse.c | 3 | ||||
-rw-r--r-- | Src/subst.c | 30 |
5 files changed, 51 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog index b9fed8988..80d5861bf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2004-06-28 Peter Stephenson <pws@csr.com> + + * 20112, changed as per 20113: Src/exec.c, Src/parse.c, + Src/subst.c, Doc/Zsh/redirect.yo, Test/A04redirect.yo: + Fix here-strings to do standard single-word expansion (which + was always intended but was partially broken), and also + attempt to parse the end string for here-documents in + a more standard fashion. + 2004-06-26 Peter Stephenson <pws@pwstephenson.fsnet.co.uk> * unposted: Functions/Zle/.distfiles: add zed-set-file-name. diff --git a/Doc/Zsh/redirect.yo b/Doc/Zsh/redirect.yo index 2e48aa7ab..167c3ef21 100644 --- a/Doc/Zsh/redirect.yo +++ b/Doc/Zsh/redirect.yo @@ -70,12 +70,22 @@ occurs, `tt(\)' followed by a newline is removed, and `tt(\)' must be used to quote the characters `tt(\)', `tt($)', `tt(`)' and the first character of var(word). +Note that var(word) itself does not undergo shell expansion. Backquotes +in var(word) do not have their usual effect; instead they behave +similarly to double quotes, except that the backquotes themselves are +passed through unchanged. (This information is given for completeness +and it is not recommended that backquotes be used.) Quotes in the form +tt($')var(...)tt(') have their standard effect of expanding backslashed +references to special characters. + If tt(<<-) is used, then all leading tabs are stripped from var(word) and from the document. ) item(tt(<<<) var(word))( Perform shell expansion on var(word) and pass the result to standard input. This is known as a em(here-string). +Compare the use of var(word) in here-documents above, where var(word) +does not undergo shell expansion. ) xitem(tt(<&) var(number)) item(tt(>&) var(number))( diff --git a/Src/exec.c b/Src/exec.c index 04e0e19ad..90e75db64 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -2714,9 +2714,10 @@ gethere(char *str, int typ) for (s = str; *s; s++) if (INULL(*s)) { - *s = Nularg; qt = 1; + break; } + quotesubst(str); untokenize(str); if (typ == REDIR_HEREDOCDASH) { strip = 1; diff --git a/Src/parse.c b/Src/parse.c index 6bef195f8..0d0dc6c35 100644 --- a/Src/parse.c +++ b/Src/parse.c @@ -1754,9 +1754,6 @@ par_redir(int *rp) if ((tokstr[0] == Inang || tokstr[0] == Outang) && tokstr[1] == Inpar) type = tokstr[0] == Inang ? REDIR_INPIPE : REDIR_OUTPIPE; break; - case REDIR_HERESTR: - remnulargs(name = dupstring(name)); - break; } yylex(); diff --git a/Src/subst.c b/Src/subst.c index 189ecda6e..da3db5844 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -231,6 +231,36 @@ stringsubst(LinkList list, LinkNode node, int ssub, int asssub) return errflag ? NULL : node; } +/* + * Simplified version of the prefork/singsub processing where + * we only do substitutions appropriate to quoting. Currently + * this means only the expansions in $'....'. This is used + * for the end tag for here documents. As we are not doing + * `...` expansions, we just use those for quoting. However, + * they stay in the text. This is weird, but that's not + * my fault. + * + * The remnulargs() makes this consistent with the other forms + * of substitution, indicating that quotes have been fully + * processed. + */ + +/**/ +void +quotesubst(char *str) +{ + char *s = str; + + while (*s) { + if (*s == String && s[1] == Snull) { + s = getkeystring(s, NULL, 4, NULL); + } else { + s++; + } + } + remnulargs(str); +} + /**/ mod_export void globlist(LinkList list, int nountok) |