From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5339 invoked by alias); 13 Oct 2017 12:55:32 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: List-Unsubscribe: X-Seq: 41877 Received: (qmail 18638 invoked by uid 1010); 13 Oct 2017 12:55:32 -0000 X-Qmail-Scanner-Diagnostics: from mailout2.w1.samsung.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(210.118.77.12):SA:0(-6.9/5.0):. Processed in 2.846863 secs); 13 Oct 2017 12:55:32 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_HI, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS autolearn=ham autolearn_force=no version=3.4.1 X-Envelope-From: p.stephenson@samsung.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | X-AuditID: cbfec7f5-f79d06d0000031c7-b0-59e0b7bb4f5c Date: Fri, 13 Oct 2017 13:55:19 +0100 From: Peter Stephenson To: Zsh hackers list Subject: Re: [bug] sh: tilde expansion after field splitting Message-id: <20171013135519.7e3de920@pwslap01u.europe.root.pri> In-reply-to: <4c5bad3d-fdf6-3eae-8bbe-ec443c740a36@inlv.org> Organization: Samsung Cambridge Solution Centre X-Mailer: Claws Mail 3.7.9 (GTK+ 2.22.0; i386-redhat-linux-gnu) MIME-version: 1.0 Content-type: text/plain; charset="US-ASCII" Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrLIsWRmVeSWpSXmKPExsWy7djP87q7tz+INNi3UdDiYPNDJgdGj1UH PzAFMEZx2aSk5mSWpRbp2yVwZexpn85asFOy4mvHSrYGxqnCXYycHBICJhKdT/pZIGwxiQv3 1rN1MXJxCAksZZT4s+wuC4TTyyRx5M43ZpiOiysuMUIkljFKHLu2iREkISQwjUli4h4eCPsM o8S87iQI+yyjxNfbKiA2i4CqxIXefrB6NgFDiambZoPZIgJaEjtOnmQCsYUFbCR+TTzBCmLz CthL3H/xHuw8TqB4w64mdhCbX0Bf4urfT0wQB9lLzLxyhhGiXlDix+R7YPXMAjoS27Y9Zoew 5SU2r3nLDHK0hMACNomTe9ugml0kPtzYB/WZsMSr41vYIWwZic6Og1A1/YwST7p9IZpnMEqc PrODDSJhLdF3+yIjxAY+iUnbpgMN4gCK80p0tAlBlHhIzP12E2qOo0T35knQ8P3AKHF84j7G CYwKs5AcPgvJ4bOQHL6AkXkVo0hqaXFuemqxqV5xYm5xaV66XnJ+7iZGYCI4/e/41x2MS49Z HWIU4GBU4uEVqLofKcSaWFZcmXuIUYKDWUmEl33bg0gh3pTEyqrUovz4otKc1OJDjNIcLEri vLZRbZFCAumJJanZqakFqUUwWSYOTqkGRo+pHHFbGyN2vWluLIne/VVp1p0/9tzl61fVeqot L1slt9xZ/P1jsasxnmd3Vc4p3TEr48OxL6JbzI+45bx7yCOyZ0nK3SVBy6eGW13/v2dax+I/ fYF9J3RPLi3qSyqcx3E1o2aXpIOYysczhbe/fRf0nW/grVM/5cm+erHz2i8+FXzelXxz2mQl luKMREMt5qLiRADgfNCIAAMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrILMWRmVeSWpSXmKPExsVy+t/xq7q7tj+INOicYGpxsPkhkwOjx6qD H5gCGKO4bFJSczLLUov07RK4Mva0T2ct2ClZ8bVjJVsD41ThLkZODgkBE4mLKy4xQthiEhfu rWfrYuTiEBJYwiix5tJVZghnBpPE0stHGCGcc4wSq7bOgSo7yyhxu28JWD+LgKrEhd5+MJtN wFBi6qbZYLaIgJbEjpMnmUBsYQEbiV8TT7CC2LwC9hL3X7xnAbE5geINu5rYIYZ+YJR48fci O0iCX0Bf4urfT0wQB9pLzLxyhhGiWVDix+R7YM3MQAs2b2tihbDlJTavecsMYgsJqEvcuLub fQKj8CwkLbOQtMxC0rKAkXkVo0hqaXFuem6xoV5xYm5xaV66XnJ+7iZGYEBvO/Zz8w7GSxuD DzEKcDAq8fAKVN2PFGJNLCuuzD3EKMHBrCTCy77tQaQQb0piZVVqUX58UWlOavEhRmkOFiVx 3t49qyOFBNITS1KzU1MLUotgskwcnFINjPFtXhev/l2ycVn02STv68wxLEUfjnd+n9r293Up 23fGjCfPLimnf2tfve3JccP/FveZdJV6/6hfO/qe+wGvwPnHax/ycXxJMvl7oXSRiyuTzctv jqoGfgEKRXJ7Nkl0zdddPN9n71VTky3yfD5Fy97furtloffnBS1fc3eahtZ//2Su/XnWMSMl luKMREMt5qLiRADMY4wtZAIAAA== X-CMS-MailID: 20171013125522eucas1p1dd9cecd0ad4ebb95561cab8dcebaafb2 X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?UTF-8?B?UGV0ZXIgU3RlcGhlbnNvbhtTQ1NDLURhdGEgUGxhbmUb?= =?UTF-8?B?7IK87ISx7KCE7J6QG1ByaW5jaXBhbCBFbmdpbmVlciwgU29mdHdhcmU=?= X-Global-Sender: =?UTF-8?B?UGV0ZXIgU3RlcGhlbnNvbhtTQ1NDLURhdGEgUGxhbmUbU2Ft?= =?UTF-8?B?c3VuZyBFbGVjdHJvbmljcxtQcmluY2lwYWwgRW5naW5lZXIsIFNvZnR3YXJl?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDA1Q0QwNTAwNTg=?= CMS-TYPE: 201P X-CMS-RootMailID: 20171013095630epcas2p25dc7d70e2ce557a17e874b37e9715345 X-RootMTR: 20171013095630epcas2p25dc7d70e2ce557a17e874b37e9715345 References: <06fb6a91-6766-bbd7-9543-cbafe704ee59@inlv.org> <171008005347.ZM1177@torch.brasslantern.com> <4c5bad3d-fdf6-3eae-8bbe-ec443c740a36@inlv.org> On Fri, 13 Oct 2017 11:43:17 +0200 Martijn Dekker wrote: > Op 08-10-17 om 09:53 schreef Bart Schaefer: > > On Oct 5, 12:20am, Martijn Dekker wrote: > > } Subject: [bug] sh: tilde expansion after field splitting > > } > > } POSIX says tilde expansion should be done before parameter expansion [...] > > } zsh did this correctly up to version 5.0.8; as of 5.1, it appears to do > > } tilde expansion *after* field splitting, and only from the second field on. > > > > The patch below fixes this, I believe. Several comments: > > This introduces a bug with "$@", $@ and $* expansion: > > $ Src/zsh -o SHFILEEXPANSION -c 'set "a" "b"; printf "[%s]\n" "$@$@"' > [a] > [b$@] > > $ Src/zsh -o SHFILEEXPANSION -c 'set "a" "b"; printf "[%s]\n" $@$@' > [a] > [b$@] > > $ zsh -o SHFILEEXPANSION -c 'set "a" "b"; printf "[%s]\n" $*$*' > zsh:1: no matches found: b$* Would it be easier to do something like this? I don't think efficiency is much of an issue here. pws diff --git a/Src/subst.c b/Src/subst.c index 8c290cc..d027e3d 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -108,7 +108,6 @@ prefork(LinkList list, int flags, int *ret_flags) queue_signals(); node = firstnode(list); while (node) { - LinkNode nextnode = 0; if ((flags & (PREFORK_SINGLE|PREFORK_ASSIGN)) == PREFORK_ASSIGN && (insnode = keyvalpairelement(list, node))) { node = insnode; @@ -137,23 +136,31 @@ prefork(LinkList list, int flags, int *ret_flags) * testing if cptr changed... */ setdata(node, cptr); - /* - * Advance now because we must not expand filenames again - * after string substitution (which may insert new nodes). - */ - nextnode = node; - incnode(nextnode); - } - if (!(node = stringsubst(list, node, - flags & ~(PREFORK_TYPESET|PREFORK_ASSIGN), - ret_flags, asssub))) { - unqueue_signals(); - return; } - if (isset(SHFILEEXPANSION)) - node = nextnode; else - incnode(node); + { + if (!(node = stringsubst(list, node, + flags & ~(PREFORK_TYPESET|PREFORK_ASSIGN), + ret_flags, asssub))) { + unqueue_signals(); + return; + } + } + incnode(node); + } + if (isset(SHFILEEXPANSION)) { + /* + * stringsubst() may insert new nodes, so doesn't work + * well in the same loop as file expansion. + */ + for (node = firstnode(list); node; incnode(node)) { + if (!(node = stringsubst(list, node, + flags & ~(PREFORK_TYPESET|PREFORK_ASSIGN), + ret_flags, asssub))) { + unqueue_signals(); + return; + } + } } for (node = firstnode(list); node; incnode(node)) { if (node == stop) diff --git a/Test/E01options.ztst b/Test/E01options.ztst index 6929f51..0f6bb34 100644 --- a/Test/E01options.ztst +++ b/Test/E01options.ztst @@ -1038,6 +1038,16 @@ F:Regression test for workers/41811 >~/one >~/two + ( + setopt shfileexpansion + set -- also appearing + print -l $*$* + ) +0:SH_FILE_EXPANSION interaction with inserting nodes from parameters +>also +>appearingalso +>appearing + testpat() { if [[ $1 = ${~2} ]]; then print $1 $2 yes; else print $1 $2 no; fi }