[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 17:22:35 +0100 |
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
>
- Re: string substitution broken since 5.2, (continued)
Re: string substitution broken since 5.2, Thierry B., 2022/11/03
Re: string substitution broken since 5.2, Chet Ramey, 2022/11/03
- Re: string substitution broken since 5.2, Léa Gris, 2022/11/04
- Re: string substitution broken since 5.2, Alex fxmbsw7 Ratchev, 2022/11/04
- Re: string substitution broken since 5.2, Greg Wooledge, 2022/11/04
- Re: string substitution broken since 5.2, Alex fxmbsw7 Ratchev, 2022/11/04
- Re: string substitution broken since 5.2, Greg Wooledge, 2022/11/04
- Re: string substitution broken since 5.2,
Alex fxmbsw7 Ratchev <=
- Re: string substitution broken since 5.2, Chet Ramey, 2022/11/04
- Re: string substitution broken since 5.2, Alex fxmbsw7 Ratchev, 2022/11/04
- Re: string substitution broken since 5.2, Alex fxmbsw7 Ratchev, 2022/11/04
Re: string substitution broken since 5.2, Chet Ramey, 2022/11/04
Re: string substitution broken since 5.2, Martin D Kealey, 2022/11/04