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
, ksh
y bash
se comportan igual. Al menos porque csh
no 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 alias
no se ejecutó.
Respuesta3
si realmente quieresun trazador de líneas, entonces tú puedesusar función en lugar de alias.
Por ejemplo, creas py3
un 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 py3
como function
en lugar de alias
:
$ function py3() { python3 "$@"; }; py3 -c 'print("hello, world")'
hello, world
O export -f
antes 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