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

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

来自 bash 手册

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

我明白在函数定义中使用别名可能存在一些潜在问题,虽然还是有一些疑问当运行函数定义和调用函数时,以下哪些 shell 操作是在函数体内执行的?

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

还有哪些其他类型的复合命令可能会出现哪些别名问题?

答案1

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

恰恰相反(您的 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

首先,您可以看到,由于&&引入了复合命令,shell 不会执行任何操作并提示输入第二行。

当这个两行复合命令是,在执行命令之前替换别名。进行此替换时,echo别名尚不存在,因此不会替换任何内容。最后,当执行整个命令时,这是echo使用的内置命令,即使它位于别名定义之后。

当第二个echo命令是echo别名存在并被替换。因此,执行的命令是echo Follow my advice: Use aliases sparingly

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

相关内容