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.