Как перебирать последовательно пронумерованные псевдонимы?

Как перебирать последовательно пронумерованные псевдонимы?

У меня есть 3 псевдонима. Они называются echo1, echo2, echo3

Как выполнить все три из них как часть более крупной команды?

$ 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

Решение: на основе ответа Кусалананды:

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

решение1

Из-за порядка оценки вещей, echo$iбудет оценена строка echo1(для i=1)послерасширение псевдонима.

Чтобы использовать строку в качестве псевдонима, необходимо повторно оценить полученную строку:

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

Если echo1бы echo2и echo3былофункции оболочки, то это evalбыло не нужно (проверено в Bash 4.4).

Ваши попытки bash -cне сработают, поскольку псевдонимы являются локальными для текущего сеанса оболочки.

Ваша первоначальная вещь

echo{1..3}

приведет к

echo1 echo2 echo3

Даже если бы echo1он был расширен до echo 1, результатом был бы вывод строки

1 echo2 echo3

Лично я думаю, в зависимости от того, что вы хотели бы, чтобы псевдонимына самом делесделать, я бы реализовал функцию:

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

... а затем назвал это

dothing {1..3}

производить

1
2
3

Конечно, этого можно было бы достичь printf '%s\n' {1..3}напрямую...

решение2

Почему бы не создать еще одну функцию, которая будет выполнять псевдонимы?

function execute_all_aliases{
  alias1
  alias2
  alias3
}

решение3

Вы всегда можете сделать:

eval echo{1..3}\;

Это значит, что оболочке нужно оценить расширение этого кода как кода оболочки, то есть оценить:

echo1; echo2; echo3;

Некоторые другие варианты:

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

решение4

Благодаря @Kusalananda я придумал следующее решение:

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

Это позволит достичь цели выполнения n-ного количества псевдонимов, последовательно названных другими частями команды.

Связанный контент