
У меня есть 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-ного количества псевдонимов, последовательно названных другими частями команды.