Usually, $0
in a script is set to the name of the script, or to whatever it was invoked as (including the path). However, if I use bash
with the -c
option, $0
is set to the first of the arguments passed after the command string:
bash -c 'echo $0' foo bar
# foo
In effect, it seems like positional parameters have been shifted, but including $0
. However shift
in the command string doesn't affect $0
(as normal):
bash -c 'echo $0; shift; echo $0' foo bar
# foo
# foo
Why this apparently odd behaviour for command strings? Note that I am looking for the reason, the rationale, behind implementing such odd behaviour.
One could speculate that such a command string wouldn't need the $0
parameter as usually defined, so for economy it is also used for normal arguments. However, in that case the behaviour of shift
is odd. Another possibility is that $0
is used to define the behaviour of programs (a la bash
called as sh
or vim
called as vi
), but that cannot be, since $0
here is only seen in the command string and not by programs called within it. I cannot think of any other uses for $0
, so I am at a loss to explain this.
-
for the$0
argument as an idiom, like insh -c 'foo $1 $2' - a b
. This way it looks pretty normal (once you found out what that-
means, that is) – Volker Siegel Aug 27 '14 at 11:21echo 'echo the other side of this pipe globs "$@"' | sh -s -- *
, though, unfortunately,$0
is generally not a settable parameter with the-s
tream option... It can be used in many of the same waysxargs
generally is, though. And others besides. – mikeserv Aug 27 '14 at 11:48--
, then that could have had the usual interpretation of 'from here starts the arguments', seen in some other programs. Then again, that could be confuse those unfamiliar with-c
to think--
actually does have that interpretation. – muru Aug 27 '14 at 12:00