Como você percorre os aliases numerados sequencialmente?

0

Eu tenho 3 aliases. Eles são chamados de echo1, echo2, echo3

Como executo todos os 3 deles 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{}"
    
por yosefrow 01.06.2017 / 02:45

4 respostas

3

Por causa da ordem de avaliação das coisas, echo$i seria avaliado para a string echo1 (para i=1 ) após expansão do 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 , echo2 e echo3 foram funções do shell , então o eval não foi necessário (testado no Bash 4.4).

Suas tentativas com bash -c nã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 echo1 tenha sido expandido para echo 1 , o resultado foi a saída da string

1 echo2 echo3

Pessoalmente, dependendo do que você queria que os aliases fizessem , eu teria implementado uma função:

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

... e depois chamou isso com

dothing {1..3}

para produzir

1
2
3

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

    
por 01.06.2017 / 07:28
0

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

function execute_all_aliases{
  alias1
  alias2
  alias3
}
    
por 01.06.2017 / 12:07
0

Você sempre pode fazer:

eval echo{1..3}\;

Isso é dizer ao shell para avaliar a expansão desse código shell, que é 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
    
por 01.06.2017 / 13:26
0

Graças a @Kusalananda, desenvolvi a seguinte solução:

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

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

    
por 04.06.2017 / 05:04