如何循环显示按顺序编号的别名?

如何循环显示按顺序编号的别名?

我有 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,echo2echo3曾经是外壳函数,那么就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个与其他命令部分依次命名的别名的目标

相关内容