[Toybox] One more bash corner case.
Rob Landley
rob at landley.net
Mon Dec 16 01:26:17 PST 2024
On 12/14/24 12:32, Chet Ramey wrote:
> On 12/14/24 8:30 AM, Rob Landley wrote:
>> In devuan deadmaus, which claims bash --version 5.2.15(1)-release
>> (x86_64- pc-linux-gnu) when I do:
>>
>> echo -e 'echo \n' | env -i PATH=${PATH at Q} PS1='\\$ ' bash --noediting
>> -- noprofile --norc -is
>>
>> It prints $ three times instead of printing \$ three times. But when I
>> add -c 'echo $PS1' it says "\\$" which has both slashes. (Which makes
>> sense because single quotes, above...)
>> \\
>> The man page says \\ is a literal backslash, but it's not printing.
>
> OK, think about this in terms of all the expansions for PS1.
>
> First, it expands \\$ because of the \\ prompt expansion, leaving \$
> when that phase is complete.
If by "it" you mean "the prompt logic", then yes that's what I expected.
> Then, after expanding the backslash-escape sequences,
>
> "After the string is
> decoded, it is expanded via parameter expansion, command substitution,
> arithmetic expansion, and quote removal, subject to the value of the
> promptvars shell option"
>
> Since promptvars is enabled by default, quote removal removes the
> backslash, leaving `$ '.
Aha: the "promptvars" option gratuitously expands PS1 _twice_:
$ touch potato
$ PS1='$(rm potato)' bash --noprofile --norc
exit
exit
$ ls -l potato
ls: cannot access 'potato': No such file or directory
And you default it to on. Good to know.
Rob
More information about the Toybox
mailing list