Por lo general, $0en una secuencia de comandos se establece el nombre de la secuencia de comandos, o lo que se invocó como (incluida la ruta). Sin embargo, si lo uso bashcon la -copción, $0se establece en el primero de los argumentos pasados después de la cadena de comando:
bash -c 'echo $0 ' foo bar
# foo
En efecto, parece que los parámetros posicionales se han cambiado, pero incluidos $0. Sin embargo, shiften la cadena de comando no afecta $0(como es normal):
bash -c 'echo $0; shift; echo $0 ' foo bar
# foo
# foo
¿Por qué este comportamiento aparentemente extraño para las cadenas de comandos? Tenga en cuenta que estoy buscando la razón, la justificación, detrás de la implementación de un comportamiento tan extraño.
Se podría especular que una cadena de comandos de este tipo no necesitaría el $0parámetro como se define generalmente, por lo que para economía también se usa para argumentos normales. Sin embargo, en ese caso el comportamiento de shiftes extraño. Otra posibilidad es que $0se usa para definir el comportamiento de los programas (a la bashllamada as sho vimllamada as vi), pero eso no puede ser, ya que $0aquí solo se ve en la cadena de comandos y no por los programas llamados dentro de ella. No puedo pensar en ningún otro uso $0, así que no puedo explicarlo.
echo 'echo the other side of this pipe globs "$@"' | sh -s -- *embargo, también puede , desafortunadamente, $0generalmente no ser un parámetro configurable con la -sopción de tream ... Sin embargo, se puede usar de muchas de las mismas maneras xargs. Y otros además.
--, entonces eso podría haber tenido la interpretación habitual de 'desde aquí comienza los argumentos', visto en algunos otros programas. Por otra parte, eso podría confundir a aquellos que no están familiarizados con -cpensar que --realmente tienen esa interpretación.
-para el$0argumento como un modismo, como ensh -c 'foo $1 $2' - a b. De esta manera se ve bastante normal (una vez que descubriste lo que eso-significa, eso es)