Quiero ejecutar un alias dentro de una bash -c
construcción.
El bash
manual dice:
Los alias no se expanden cuando el shell no es interactivo, a menos que la
expand_aliases
opción del shell se establezca utilizandoshopt
En este ejemplo, ¿por qué hi
no se encuentra el alias cuando se configura expand_aliases
explícitamente?
% bash -O expand_aliases -c "alias hi='echo hello'; alias; shopt expand_aliases; hi"
alias hi='echo hello'
expand_aliases on
bash: hi: command not found
Estoy corriendo GNU bash, version 5.0.0(1)-release (x86_64-pc-linux-gnu)
.
Contexto: quiero poder ejecutar un alias con prioridad inactiva, por ejemplo, un script que contenga:
#!/bin/bash
exec chrt -i 0 nice -n 19 ionice -c 3 bash -c ". ~/.config/bash/aliases; shopt -s expand_aliases; $(shell-quote "$@")"
Quiero evitar el uso bash -i
ya que no quiero .bashrc
que se lea mi .
bash -c "hi () { echo hello; }; hi"
salidashello
.zsh
: los alias zsh no se expanden incluso con la opcióncomplete_aliases
Respuestas:
No parece funcionar si configura el alias en la misma línea que se usa. Probablemente tenga algo que ver con cómo se expanden los alias muy temprano en el procesamiento de la línea de comandos, antes de la etapa de análisis real. En un shell interactivo:
Observe cómo el alias utilizado está retrasado una línea: en el segundo comando no encuentra el alias que acaba de establecer, y en el tercer comando usa el que se configuró previamente.
Entonces, funciona si ponemos una nueva línea dentro de la
-c
cadena:(También puede usar en
bash -O expand_aliases -c ...
lugar de usarshopt
dentro del script, no es que ayude con la nueva línea).Alternativamente, podría usar una función de shell en lugar de un alias, también son mucho mejores en otras formas:
fuente
Convirtiendo mi comentario en una respuesta, como lo sugirió ilkkachu.
El manual de Bash (vinculado a la pregunta) proporciona una explicación de cómo se manejan los alias cuando hay una definición de alias y un comando en la misma línea.
Cita (ligeramente formateada para mayor claridad):
La respuesta de ilkkachu proporciona múltiples soluciones posibles a este problema.
fuente