¿Cómo se desplaza por los alias numerados secuencialmente?

¿Cómo se desplaza por los alias numerados secuencialmente?

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$ise 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 echo1y echo2hubiera echo3sidofunciones de shell, entonces evalno había sido necesario (probado en Bash 4.4).

Sus intentos bash -cno 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 echo1se 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

información relacionada