On 28/04/24 22:50, Chet Ramey wrote:
On 4/28/24 3:07 PM, Gioele Barabucci wrote:

     $ su -l $USER -s /bin/bash-static -c 'echo $BASH; readlink /proc/$$/exe; head -1z /proc/$$/cmdline; echo'
     /bin/bash
     /usr/bin/bash-static
     -bash-static

So argv[0] == "-bash-static", which causes $0 to be set to -bash-static
and internally sets shell_name to "bash-static" and login_shell to 1
(which notes that bash was executed with argv[0][0] == '-').

Then when you get to setting $BASH, this code gets executed:

   if ((login_shell == 1) && RELPATH(shell_name))
     {
       if (current_user.shell == 0)
         get_current_user_info ();
       name = savestring (current_user.shell);
     }

which has been the way bash has behaved since the bash-1.x days. Is
this enough of an issue to change behavior that dates back that far?

The bash manual defines $BASH as follows:

Expands to the full filename used to invoke this instance of bash.
So, either the code or the manual should be changed.

I see why changing such an old behavior for the sake of correctness may not be worth the risk of breaking somebody's workflow. But at the same time it is hard to believe that anybody may be relying on "$BASH contains the user shell set up in /etc/passwd when read from a login shell".

In my case, I intended to use $BASH to make sure that the right binary was picked up by a certain test. I assume I'm not the only one using it in that way.

Regards,

--
Gioele Barabucci

Reply via email to