bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: string substitution broken since 5.2


From: Alex fxmbsw7 Ratchev
Subject: Re: string substitution broken since 5.2
Date: Fri, 4 Nov 2022 19:53:06 +0100

addition to my greycat-answer mail

.. i didnt use & there at all , my fault .. but with & its no else

root@localhost:~# a=i_am_foo b=_ c=${b}am$b d=$b\&$b e=${a//"$c"/"$d"} ;
printf ' -->  %s\n' "$e" "${a//"$c"/"$d"}"
 -->  i_&_foo
 -->  i_&_foo

sorry
short imo , the ' " not parsing is outdated , and got fixed later

u may want bash v<1 compatibility ?

i just say its two horsrs , one about old and keep , the other about new
and updated

On Fri, Nov 4, 2022, 17:22 Alex fxmbsw7 Ratchev <fxmbsw7@gmail.com> wrote:

>
>
> On Fri, Nov 4, 2022, 17:03 Greg Wooledge <greg@wooledge.org> wrote:
>
>> On Fri, Nov 04, 2022 at 01:30:16PM +0100, Alex fxmbsw7 Ratchev wrote:
>> > > 1) Put something like "shopt -u patsub_replacement 2>/dev/null ||
>> true"
>> > >    at the top of your script.
>> > >
>> >
>> > there d be many such senselessnesses
>> >
>> > >
>> > > 2) Assign the result of the expansion to a temporary variable, and
>> pass
>> > >    the temp var to somecmd.  Every.  Single.  Time.
>> > >
>> >
>> > ? i dont get that
>>
>> OK.  Let me offer a quick example script.  It works as expected in
>> bash-5.1:
>>
>> unicorn:~$ cat foo
>> #!/bin/bash
>> template='The best candy is clearly @CANDY@!'
>> candy='M&Ms'
>> printf '%s\n' "${template/@CANDY@/"$candy"}"
>>
>> unicorn:~$ ./foo
>> The best candy is clearly M&Ms!
>>
>> Now, let's run this script under bash-4.2:
>>
>> unicorn:~$ bash-4.2 ./foo
>> The best candy is clearly "M&Ms"!
>>
>> Uh oh!  The quotes are wrong for bash-4.2.  Bug #1 is filed for this
>> issue.
>> As the maintainer of the script, I test a few things between bash-4.2
>> and bash-5.1 and I come up with this workaround:
>>
>> unicorn:~$ cat foo
>> #!/bin/bash
>> template='The best candy is clearly @CANDY@!'
>> candy='M&Ms'
>> printf '%s\n' "${template/@CANDY@/$candy}"    # unquote $candy to fix
>> bug #1
>>
>> unicorn:~$ bash-4.2 ./foo
>> The best candy is clearly M&Ms!
>> unicorn:~$ bash-5.1 ./foo
>> The best candy is clearly M&Ms!
>>
>> Now it works on older systems too.  Everything's fine... until bash-5.2.
>>
>> unicorn:~$ bash-5.2 ./foo
>> The best candy is clearly M@CANDY@Ms!
>>
>> The workaround for bug #1 causes bug #2 on bash-5.2.  To make the script
>> work on all three versions of bash, we need a different workaround:
>>
>> unicorn:~$ cat foo
>> #!/bin/bash
>> template='The best candy is clearly @CANDY@!'
>> candy='M&Ms'
>> message=${template/@CANDY@/"$candy"}          # Work around bug #1 and
>> #2.
>> printf '%s\n' "$message"
>>
>> unicorn:~$ bash-4.2 ./foo
>> The best candy is clearly M&Ms!
>> unicorn:~$ bash-5.1 ./foo
>> The best candy is clearly M&Ms!
>> unicorn:~$ bash-5.2 ./foo
>> The best candy is clearly M&Ms!
>>
>> And there you have it.  You're allowed to quote "$candy" in a variable
>> assignment, as long as the whole parameter expansion ${...} remains
>> unquoted, and it'll work properly in all 3 versions.  I'm using "message"
>> as a temporary variable, whose sole purpose is to work around this issue.
>>
>
> mate , thank you for investing time in explainmennts
>
> what on yours i ask , o i see now , 4.2 ..
> i quote right in ${ // - to me , preserved quotes are • an invalid youth
> bug to be replaced with better by bash.c changes
> which it seemfully did
>
> is quotes preserveness the only bug here i see ?
>
> root@localhost:~# a=i_am_foo b=_ c=${b}am$b d=${b}be$b e=${a//"$c"/"$d"}
> ; printf ' -->  %s\n' "$e" "${a//"$c"/"$d"}"
>  -->  i_be_foo
>  -->  i_be_foo
>
> for me , trying to support such wrongness , resulted ( along other same
> logics.. ) in a 'best is newest upstream version' rule
>
>>


reply via email to

[Prev in Thread] Current Thread [Next in Thread]