Nuevo alias no disponible después de ;

Nuevo alias no disponible después de ;

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>se desconoce mientras que se conoce en la siguiente línea. csh, tcsh, sh, kshy bashse comportan igual. Al menos porque cshno importa si el alias se usa directamente o si un script se origina 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 es intencionado este comportamiento?

Respuesta1

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 del alias se realiza en una etapa temprana del analizador.

Antes de ejecutar la configuración de su alias, el analizador leyó toda la línea y, por este motivo, su línea de comando no funcionará.

Si el alias aparece en la siguiente línea de comando, funcionará.

Respuesta2

Este comportamiento está previsto y especificado por POSIX enSustitución de alias.

Se sustituyó un alias justo después de la ejecución del shell.Reconocimiento de tokensy ante cualquierReglas gramaticalesaplicado. En el momento en que llamó al alias <name>, el comando aliasno se ejecutó.

Respuesta3

si realmente quieresun trazador de líneas, entonces tú puedesusar función en lugar de alias.

Por ejemplo, creas py3un alias, pero solo funciona en la segunda línea:

$ alias py3=python3; py3 -c 'print("hello, world")'

Command 'py3' not found, did you mean:

  command 'py' from deb pythonpy
  command 'hy3' from deb python3-hy
  command 'pyp' from deb pyp

Try: sudo apt install <deb name>

$ py3 -c 'print("hello, world")'
hello, world

Puedes definir py3como functionen lugar de alias:

$ function py3() { python3 "$@"; }; py3 -c 'print("hello, world")'
hello, world

O export -fantes de usarlo en el proceso secundario más tarde:

$ function py3() { python3 "$@"; }; export -f py3; bash -c "py3 -c 'print("'"hello, world"'")'"
hello, world

Y si eres consciente de la diferencia devariable vs alias/función, entonces puedes usarvariabletambién:

$ py3='python3'; $py3 -c 'print("hello, world")'
hello, world

y no es necesario export -f:

$ py3='python3'; bash -c "$py3 -c 'print("'"hello, world"'")'"
hello, world

información relacionada