Por lo general, $0
en 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 bash
con la -c
opción, $0
se 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, shift
en 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 $0
pará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 shift
es extraño. Otra posibilidad es que $0
se usa para definir el comportamiento de los programas (a la bash
llamada as sh
o vim
llamada as vi
), pero eso no puede ser, ya que $0
aquí 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, $0
generalmente no ser un parámetro configurable con la -s
opció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 -c
pensar que --
realmente tienen esa interpretación.
-
para el$0
argumento 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)