On Tue 07 May 2019 at 10:12:10 (+1000), David wrote: > On Mon, 6 May 2019 at 23:53, Erik Christiansen <dva...@internode.on.net> > wrote: > > On 06.05.19 09:03, Greg Wooledge wrote: > > > On Sat, May 04, 2019 at 01:48:01PM +0200, Jonas Smedegaard wrote: > > > > Quoting Erik Christiansen (2019-05-04 08:43:53) > > > > > > pmount $1 `e2label $1` > > > > and is using the ancient deprecated command substitution syntax (which > > > will work in this case, but is not a good habit). > > > That does appear to remain opinion. The venerably traditional syntax is > > still fully legal supported bash syntax, e.g.: > > > > http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_03 > > > > The recent (late last century, IIRC) introduction of the $(...) > > alternative syntax has admittedly brought newer *nix users who know > > nothing else, and so delude themselves that there is nothing else. That > > is a misapprehension. To each, his own, especially amongst adequately > > equivalent alternatives. > > Hi Erik > > Maybe you would enjoy answering this question then? > https://lists.gnu.org/archive/html/help-bash/2019-05/msg00000.html > > Because apparently no-one else has, hehe :D
My take on this problem goes as follows. B is easy. man bash says "When the old-style backquote form of substitution is used, backslash retains its literal meaning except when followed by $, `, or \." So the \\ in B's inner echo becomes \ in the outer echo. BB shows the result of running the outer echo on the substitution made in B. A is tricky, mainly because of the middle Quotation Mark¹. So the first thing I would do is substitute a benign character, like x. The result of that substitution is shown at J. Work with that, and then change x back to Quotation Mark at the end. So K runs the inner echo and shows the result. L then runs the outer echo on that result (leaving out the [] brackets). Because \x is meaningless in double quotes, it survives the outer echo untouched. Now put back the Quotation Mark in place of x. man bash says "A double quote may be quoted within double quotes by preceding it with a backslash." And that's what we've got in M. Now working outwards, I've added the [] brackets at LL and MM, where they play no role. Finally the outer double quotes: because they pair up with the double quotes from L, that leaves the \x exposed to the outer echo and it becomes just x. Who processed the \" into " in A? The outer echo (or, if you like, the shell handing the arguments to the outer echo). Over to Greg for checking. ¹ Quotation Mark rather than double quote because it never plays the role of an active double quote as far as bash is concerned. Cheers, David.
# echo echo echo ` echo \" \\" \" ` B # " " " B echo \" \" \" BB # " " " BB echo echo echo "[` echo \" \\" \" `]" A # [ " ] A echo "[` echo \" \\x \" `]" J # [ \x ] J echo \" \\x \" K # " \x " K echo " \x " L # \x L echo " \" " M # " M echo echo echo "[` echo \" \\" \" `]" A # [ " ] A echo "[` echo \" \\x \" `]" J # [ \x ] J echo \" \\x \" K # " \x " K echo [" \x "] LL # [ \x ] LL echo [" \" "] MM # [ " ] MM echo echo echo "[` echo \" \\" \" `]" A # [ " ] A echo "[` echo \" \\x \" `]" J # [ \x ] J echo \" \\x \" K # " \x " K echo "[" \x "]" LLL # [ x ] LLL echo "[" \" "]" MMM # [ " ] MMM echo \x exposed # x exposed echo \" exposed # " exposed #