[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: 'exec -a' and $0 substitution
From: |
Lawrence Velázquez |
Subject: |
Re: 'exec -a' and $0 substitution |
Date: |
Thu, 26 Jan 2023 00:35:27 -0500 |
User-agent: |
Cyrus-JMAP/3.9.0-alpha0-85-gd6d859e0cf-fm-20230116.001-gd6d859e0 |
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