为什么不在复合命令中使用别名?

Tim*_*Tim 2 bash alias

来自 bash 手册

别名在读取函数定义时展开,而不是在执行函数时展开,因为函数定义本身就是一个复合命令。因此,函数中定义的别名在执行该函数之前不可用。为安全起见,始终将别名定义放在单独的行上,并且不要在复合命令中使用别名

我知道在函数定义中使用别名可能存在一些潜在的问题,但仍然对在运行函数定义和调用函数时在函数体内执行以下哪些 shell 操作有疑问.

但是为什么“不要在复合命令中使用别名”从函数定义推广到通用复合命令呢?

还有哪些复合命令会出现别名问题呢?

xhi*_*nne 5

但是为什么“不要在复合命令中使用别名”从函数定义推广到通用复合命令呢?

反之亦然(您的 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命令时,别名存在并被替换。因此,执行的命令是。echoecho Follow my advice: Use aliases sparingly

函数定义是一种更大的复合命令,但功能是相同的。任何内部别名定义仅在调用函数时生效。