From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7518 invoked by alias); 21 Nov 2014 20:23:45 -0000 Mailing-List: contact zsh-users-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Users List List-Post: List-Help: X-Seq: 19413 Received: (qmail 18886 invoked from network); 21 Nov 2014 20:23:33 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_LOW, T_HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=ham version=3.3.2 X-Authority-Analysis: v=2.1 cv=HYUtEE08 c=1 sm=1 tr=0 a=SBdK3agBVlyT/P6vVha89Q==:117 a=SBdK3agBVlyT/P6vVha89Q==:17 a=G8GL833Es-AA:10 a=IkcTkHD0fZMA:10 a=nSWkniFtqLfcXjXaJ6IA:9 a=QEXdDO2ut3YA:10 Message-id: <546F9F41.8040608@eastlink.ca> Date: Fri, 21 Nov 2014 12:23:29 -0800 From: Ray Andrews User-Agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Icedove/31.2.0 MIME-version: 1.0 To: Zsh Users Subject: syntactic question Content-type: text/plain; charset=utf-8; format=flowed Content-transfer-encoding: 7bit All, Running this script: test="one\ttwo" echo 1 ${test//'\'/\\} echo "2 ${test//'\'/\\}" echo 3 ${test//\\/\\} echo "4 ${test//\\/\\}" echo 5 ${test//'\'/'\'} echo "6 ${test//'\'/'\'}" echo "7 ${test//'\'/'\\'}" echo "8 ${test//'\'/'\\\\'}" echo "9 ${test//'\\'/'\\'}" ... I get this output: 1 one two 2 one two 3 one two 4 one two 5 one two 6 one'\'ttwo 7 one'\'ttwo 8 one'\'ttwo 9 one two Lines one thru five are no puzzle, they're just different ways of saying the same thing: we're replacing the backslash character with itself (as an exercise). But at line six the rules change. Now the outer quotes seem to be meddling inside the substitution, and the single-quoted backslash output becomes literal: '\' but the input syntax is unchanged. I've always thought that all parsing systems work from the 'inside out' which is to say that (as with math) you 'do' the deepest parenthesis first, and then work outward. In the same spirit, I'm expecting the substitution to do what it does following it's own rules and nevermind any quotations or anything else 'further out'. But if zsh does permit the outer quotes to change what happens inside the substitution, then why is it not equal in it's effect on the input string? I'm puzzled by the fact that lines six, seven and eight produce the same output, and there again there is no symmetry between the input and the output strings, since, in line nine, doubling the input backslash doesn't work, whereas it does work in the output string (seven). It seems 'obvious' to me that all of the above, except seven and eight, are saying 'replace a backslash with itself'. Six should work the same as one thru five, and if seven works, then so should nine. Why line eight works, I'm not sure I even want to know ;-) In practice there's no huge problem tho, since the 'all backslash' forms always work the same way. Is this understandable for a mere mortal?