Hasta ahora, pensaba que un punto y coma en el shell tiene (de alguna manera) el mismo significado que un salto de línea. Así que me sorprendió que por
alias <name>=<replacement text>; <name>
<name>
es desconocido mientras se sabe en la siguiente línea. csh
, tcsh
, sh
, ksh
Y bash
se comportan de la misma. Al menos csh
, no importa si el alias se usa directamente o si un script se obtiene antes del punto y coma: los alias no se conocen después, ;
pero se conocen en la siguiente línea de comando. ¿Es esto un error o se pretende este comportamiento?
Respuestas:
La sintaxis de alias que está utilizando no es apropiada para un shell POSIX, para un shell POSIX, debe usar:
Pero para todos los shells, esto no puede funcionar ya que el reemplazo de alias se realiza temprano en el analizador.
Antes de que se ejecute su configuración de alias, el analizador leyó toda la línea y, por esta razón, su línea de comando no funcionará.
Si el alias aparece en la siguiente línea de comando, funcionará.
fuente
yash
ozsh
no expandirían el aliasshell -c 'alias name=replacement<newline>replacement'
. Para AT&Tksh
, tendría el problema con los scripts de origen .=
se usa ninguno en laalias
sintaxis.=
. es porque la expansión del alias ocurre cuando el shell ve por primera vez la línea, que es antes de definir el alias.zsh/yash -c 'code'
quecode
se analiza en su conjunto. No parece ser el caso del shell Bourne. Así que supongo que el shell Bourne analizacode
una línea a la vez.Este comportamiento está previsto y especificado por POSIX en Alias Substitution .
Se sustituyó un alias justo después de que el shell realizara el Reconocimiento de tokens y antes de que se aplicaran las Reglas de gramática . En el momento en que llamó al alias
<name>
, el comandoalias
no se ejecutó.fuente