
Tengo 3 alias. Se llaman echo1, echo2, echo3.
¿Cómo ejecuto los 3 como parte de un comando más grande?
$ alias echo1='echo 1'
$ alias echo2='echo 2'
$ alias echo3='echo 3'
$ echo1
1
$ echo2
2
$ echo3
3
$ echo{1..3}
bash: echo1: command not found
$ bash -ic echo{1..3}
echo2: echo1: command not found
$ bash -ic 'echo{1..3}'
bash: echo1: command not found
Solución: basada en la respuesta de Kusalananda:
printf '%s\n' {1..3} | xargs -I {} bash -ic "echo{}"
Respuesta1
Debido al orden de evaluación de las cosas, echo$i
se evaluaría en la cadena echo1
(para i=1
)despuésexpansión de alias.
Para poder utilizar la cadena como alias, es necesario volver a evaluar la cadena resultante:
for i in 1 2 3; do
eval "echo$i"
done
Si echo1
y echo2
hubiera echo3
sidofunciones de shell, entonces eval
no había sido necesario (probado en Bash 4.4).
Sus intentos bash -c
no funcionarán ya que los alias son locales para la sesión de shell actual.
Tu cosa inicial
echo{1..3}
resultaría en
echo1 echo2 echo3
Incluso si echo1
se hubiera expandido a echo 1
, el resultado habría sido la salida de la cadena
1 echo2 echo3
Personalmente, dependiendo de lo que quisieras que fueran los aliasde hechohacer, habría implementado una función:
dothing () {
printf '%s\n' "$@"
}
... y luego llamó a eso con
dothing {1..3}
para producir
1
2
3
Por supuesto, eso se habría logrado printf '%s\n' {1..3}
directamente...
Respuesta2
¿Por qué no crear otra función que ejecute los alias?
function execute_all_aliases{
alias1
alias2
alias3
}
Respuesta3
Siempre puedes hacer:
eval echo{1..3}\;
Es decir, decirle al shell que evalúe la expansión de eso como código de shell, es decir, evaluar:
echo1; echo2; echo3;
Algunas otras variantes:
eval echo{1..3}$'\n' # separate with newline instead of ;. Can make a
# difference for things like alias echo1='echo x|'
# alias echo2='tr x y'
eval echo{1..3}'&&' : # only run the next one if the previous one succeeded
Respuesta4
Gracias a @Kusalananda se me ocurrió la siguiente solución:
printf '%s\n' {1..3} | xargs -I {} bash -ic "echo{}"
Esto logrará el objetivo de ejecutar n cantidad de alias nombrados secuencialmente con otras partes del comando