我有 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
解决方案:基于Kusalananda的回答:
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
将不起作用,因为别名是当前 shell 会话的本地别名。
你最初的事情
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}\;
也就是说告诉 shell 评估 shell 代码的扩展,即评估:
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个与其他命令部分依次命名的别名的目标