“与正在扩展的别名相同的单词不会再次扩展”

“与正在扩展的别名相同的单词不会再次扩展”

Bash 手册说

测试替换文本的第一个单词是否存在别名,但是与正在扩展的别名相同不再进行第二次扩展。例如,这意味着可以别名lsls -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 确实比别名扩展更进一步,但尽管如此,我认为这就是您的意思。

相关内容