O primeiro argumento não opcional para sh
se torna $0
. Quando sh
é invocado em um script, esse é o caminho para o script. Quando você executa sh -c SOMECOMMAND
, o shell não usa o argumento para nada além de colocar em $0
. Convencionalmente, seria um nome para o script passado para -c
, por analogia com o sh /path/to/script
caso em que $0
é o nome ou caminho do script.
Diferentemente da maioria dos comandos, --
é tratado como um argumento comum, não como um marcador de finalidade especial. Então é realmente --
que é usado como $0
e não o próximo argumento.
$ sh -c 'echo $1' hello
$ sh -c 'echo $0' hello
hello
$ sh -c 'echo $0; echo $1' hello world
hello
world
$ sh -c 'echo $0; echo $1' -- hello
--
hello
Isso não tem nada a ver com xargs
, está passando todos os argumentos após sh
para o comando sh
.