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$0argument 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)echo 'echo the other side of this pipe globs "$@"' | sh -s -- *, though, unfortunately,$0is generally not a settable parameter with the-stream option... It can be used in many of the same waysxargsgenerally is, though. And others besides.--, 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-cto think--actually does have that interpretation.