Geralmente, $0em um script é definido como o nome do script ou como ele foi chamado (incluindo o caminho). No entanto, se eu usar bashcom a -copção, $0será definido como o primeiro dos argumentos passados após a cadeia de comando:
bash -c 'echo $0 ' foo bar
# foo
De fato, parece que os parâmetros posicionais foram alterados, mas inclusive $0. No entanto, shiftna cadeia de comando não afeta $0(como normal):
bash -c 'echo $0; shift; echo $0 ' foo bar
# foo
# foo
Por que esse comportamento aparentemente estranho para cadeias de comando? Observe que estou procurando o motivo, a lógica, por trás da implementação de um comportamento tão estranho.
Pode-se especular que tal sequência de comandos não precisaria do $0parâmetro normalmente definido, portanto, para economia, também é usado para argumentos normais. No entanto, nesse caso, o comportamento de shifté estranho. Outra possibilidade é $0usada para definir o comportamento dos programas (a la bashchamado como shou vimchamado como vi), mas isso não pode ser, pois $0aqui é visto apenas na cadeia de comando e não pelos programas chamados dentro dela. Como não consigo pensar em outros usos $0, não sei como explicar isso.
echo 'echo the other side of this pipe globs "$@"' | sh -s -- *, porém, infelizmente, $0geralmente não é um parâmetro configurável com a -sopção tream ... No entanto, ele pode ser usado da mesma maneira que xargsgeralmente é. E outros além.
--, então isso poderia ter tido a interpretação usual de 'a partir daqui começa os argumentos', vista em alguns outros programas. Por outro lado, isso poderia confundir aqueles que não estão acostumados -ca pensar que --realmente têm essa interpretação.
-para o$0argumento como um idioma, como emsh -c 'foo $1 $2' - a b. Desta forma, parece muito normal (uma vez que você descobriu o que esse-meio, que é)