“与被扩展的别名相同的单词不会被第二次扩展”

Tim*_*Tim 0 shell bash alias

Bash手册说

替换文本的第一个单词会测试别名,但与被扩展的别名相同的单词不会第二次扩展。这意味着一个可能的别名lsls -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 比别名扩展更进一步?

xhi*_*nne 5

手册上说的是,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)