Nuevo alias no disponible después;

9

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, kshY bashse 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?

usuario3224237
fuente
"Pensé que un punto y coma en el caparazón tiene (de alguna manera) el mismo significado que un salto de línea" Casi. ¡No exactamente!
Carreras de ligereza en órbita el
1
La interpretación de punto y coma y nueva línea depende de cómo se llame al analizador. Para el comando "punto", el Bourne Shell llama al analizador con el "NLFLG" que le dice que trate la nueva línea y el punto y coma de la misma manera en algunas situaciones, pero este no es el caso en otros lugares. En general, el punto y coma y el salto de línea no son equivalentes, ya que puede tener un salto de línea, donde un punto y coma causaría un error de sintaxis.
schily

Respuestas:

9

La sintaxis de alias que está utilizando no es apropiada para un shell POSIX, para un shell POSIX, debe usar:

alias name='replacement'

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á.

astuto
fuente
Además, a algunos shells les gusta yasho zshno expandirían el alias shell -c 'alias name=replacement<newline>replacement'. Para AT&T ksh, tendría el problema con los scripts de origen .
Stéphane Chazelas
Necesito usar el csh en este caso, no =se usa ninguno en la aliassintaxis.
user3224237
@ user3224237: esto no tiene nada que ver con el =. 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.
cas
@ Stéphane Chazelas El comportamiento con los scripts "originados" es causado por el hecho de que el shell Bourne analiza completamente dichos archivos antes de que se ejecuten. Ksh se basa en la fuente Bourne Shell y todo lo que no se modificó se comporta igual.
schily 03 de
@schily, sí, es la misma razón por la zsh/yash -c 'code'que codese analiza en su conjunto. No parece ser el caso del shell Bourne. Así que supongo que el shell Bourne analiza codeuna línea a la vez.
Stéphane Chazelas