Bash 手册说
测试替换文本的第一个单词是否存在别名,但是与正在扩展的别名相同不再进行第二次扩展。例如,这意味着可以别名
ls
为ls -F
,并且 Bash 不会尝试递归地扩展替换文本。
我试图找出引用中“相同”后面的别名,
以相同的别名扩展递归序列扩展的任何别名,或者
首先开始扩展的别名,或者
最后开始扩展的别名。
所以我创建了一个例子
$ alias a1=a2;
$ alias a2=a3;
$ alias a3=a4;
并且想要检查 的别名扩展结果a1
,在以下情况下
$ alias a4=a1;
或者
$ alias a4=a2;
或者
$ alias a4=a3;
如何检查 的别名扩展结果a1
,可能是通过执行别名扩展a1
而不让 shell 进一步进行别名扩展?
答案1
手册中说的是,shell 将避免由别名扩展的递归可能引起的任何循环。
对于您的示例 ( a1=a2=a3=a4
),如果您执行,alias a4=a1
则会创建一个循环。然后,一旦您执行a1
(resp. a2
, a3
, a4
),一旦 shell 循环回到a1
(resp. a2
, a3
, a4
) ,它将搜索名为a1
(resp. a2
, a3
, a4
) 的命令,该命令不是别名(因为这会创建永无休止的循环)。
例子:
$ a1() { echo Phew, I got out of the loop; }
$ alias a1='echo "(a1)"; a2' a2='echo "(a2)"; a3'
$ alias a3='echo "(a3)"; a4' a4='echo "(a4)"; a1'
$ a1
(a1)
(a2)
(a3)
(a4)
Phew, I got out of the loop
$ a2 # Command a2 does not exist anywhere
(a2)
(a3)
(a4)
(a1)
a2: command not found
答案2
:> alias e="echo "
:> alias text=foo
:> e text
foo
从技术上讲,shell 确实比别名扩展更进一步,但尽管如此,我认为这就是您的意思。