Bash手册说
替换文本的第一个单词会测试别名,但与被扩展的别名相同的单词不会被第二次扩展。这意味着一个可能的别名
ls来ls -F,例如,和Bash不会尝试递归扩展替换文本。
我试图找出引用中“相同于”后面的别名,
在相同的别名扩展递归序列中扩展的任何别名,或
首次启动扩展的别名,或
上次开始扩展的别名。
所以我创建了一个例子
$ alias a1=a2;
$ alias a2=a3;
$ alias a3=a4;
Run Code Online (Sandbox Code Playgroud)
并想检查 的别名扩展结果a1,在以下情况下
$ alias a4=a1;
Run Code Online (Sandbox Code Playgroud)
或者
$ alias a4=a2;
Run Code Online (Sandbox Code Playgroud)
或者
$ alias a4=a3;
Run Code Online (Sandbox Code Playgroud)
如何检查 的别名扩展结果a1,可能是通过执行别名扩展a1而不让 shell 比别名扩展更进一步?
手册上说的是,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
Run Code Online (Sandbox Code Playgroud)