Como você percorre aliases numerados sequencialmente?

Como você percorre aliases numerados sequencialmente?

Eu tenho 3 apelidos. Eles são nomeados echo1, echo2, echo3

Como executo todos os três como parte de um comando maior?

$ 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

Solução: com base na resposta de Kusalananda:

 printf '%s\n' {1..3} | xargs -I {} bash -ic "echo{}"

Responder1

Por causa da ordem de avaliação das coisas, echo$iseria avaliado para a string echo1(for i=1)depoisexpansão de alias.

Para poder usar a string como um alias, você precisa reavaliar a string resultante:

for i in 1 2 3; do
    eval "echo$i"
done

Se echo1, echo2e echo3tivesse sidofunções de shell, então evalnão foi necessário (testado no Bash 4.4).

Suas tentativas bash -cnão funcionarão, pois os aliases são locais para a sessão atual do shell.

Sua coisa inicial

echo{1..3}

resultaria em

echo1 echo2 echo3

Mesmo que echo1tenha sido expandido para echo 1, o resultado foi a saída da string

1 echo2 echo3

Pessoalmente, dependendo de como você deseja que os aliasesna verdadefazer, eu teria implementado uma função:

dothing () {
    printf '%s\n' "$@"
}

... e então liguei para isso com

dothing {1..3}

para produzir

1
2
3

Claro, isso teria sido alcançado printf '%s\n' {1..3}diretamente...

Responder2

Por que não criar outra função que execute os aliases?

function execute_all_aliases{
  alias1
  alias2
  alias3
}

Responder3

Você sempre pode fazer:

eval echo{1..3}\;

Isso é dizer ao shell para avaliar a expansão disso como código shell, ou seja, avaliar:

echo1; echo2; echo3;

Algumas outras 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

Responder4

Graças a @Kusalananda encontrei a seguinte solução:

printf '%s\n' {1..3} | xargs -I {} bash -ic "echo{}"

Isso atingirá o objetivo de executar n quantidade de aliases nomeados sequencialmente com outras partes do comando

informação relacionada