On Wed, Jan 25, 2023, at 6:37 PM, Sergei Trofimovich wrote: > I fear it's a side-effect of the way 'bash' gets executed via shebang by > kernel. But maybe not? Somehow direct script execution still manages to > preserve script's name. Is it an intended behaviour that could not be > easily changed? Or it's a bug?
It's not a bug. https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html#index-0 0 ($0) Expands to the name of the shell or shell script. This is set at shell initialization. If Bash is invoked with a file of commands (see Shell Scripts), $0 is set to the name of that file. If Bash is started with the -c option (see Invoking Bash), then $0 is set to the first argument after the string to be executed, if one is present. Otherwise, it is set to the filename used to invoke Bash, as given by argument zero. Whenever bash is executed with a script file, it sets $0 to the name of that file. It only uses caller-provided values for $0 when a script file is not provided. $ (exec -a foo bash <<<'echo "$0"') foo $ (exec -a foo bash -s bar baz quux <<<'echo "$0"') foo $ (exec -a foo bash -c 'echo "$0"') foo $ (exec -a foo bash -c 'echo "$0"' bar baz quux) bar This behavior is standardized in POSIX [*] and is not unique to bash (I omitted ksh93, which actually does produce "foo" here). $ (exec -a foo zsh <(echo 'echo "$0"')) /dev/fd/63 $ (exec -a foo dash <(echo 'echo "$0"')) /dev/fd/63 $ (exec -a foo yash <(echo 'echo "$0"')) /dev/fd/63 $ (exec -a foo mksh <(echo 'echo "$0"')) /dev/fd/63 [*]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html#tag_20_117_05 -- vq