来自 bash 手册
别名在读取函数定义时展开,而不是在执行函数时展开,因为函数定义本身就是一个复合命令。因此,函数中定义的别名在执行该函数之前不可用。为安全起见,始终将别名定义放在单独的行上,并且不要在复合命令中使用别名。
我知道在函数定义中使用别名可能存在一些潜在的问题,但仍然对在运行函数定义和调用函数时在函数体内执行以下哪些 shell 操作有疑问?.
但是为什么“不要在复合命令中使用别名”从函数定义推广到通用复合命令呢?
还有哪些复合命令会出现别名问题呢?
但是为什么“不要在复合命令中使用别名”从函数定义推广到通用复合命令呢?
反之亦然(您的 bash 手册摘录不完整)。复合命令泛化为复合命令的函数定义。
复合命令一旦被完全读取就会执行。别名是在执行时定义的,而不是在读取时定义的(显然)。但是别名替换仅在读取命令时发生。
以这个复合命令为例:
$ alias echo='echo Follow my advice:' &&
> echo Alias is a basic substitution mechanism
Alias is a basic substitution mechanism
$ echo Use aliases sparingly
Follow my advice: Use aliases sparingly
Run Code Online (Sandbox Code Playgroud)
首先,您可以看到,由于&&
引入了复合命令,shell 不会执行任何操作并提示输入第二行。
读取此两行复合命令时,在执行命令之前会替换别名。在此替换时,echo
别名尚不存在,因此未替换任何内容。最后,当整个命令执行时,这是使用的内置echo
命令,即使它出现在别名定义之后。
读取第二个echo
命令时,别名存在并被替换。因此,执行的命令是。echo
echo Follow my advice: Use aliases sparingly
函数定义是一种更大的复合命令,但功能是相同的。任何内部别名定义仅在调用函数时生效。