6.6 别名(Aliases)

当使用别名时,其会使用一个单词代替一个字符串,作为简单命令中的第一个单词。shell 维护一个可以使用内建命令 alias 和 unalias 进行设置和释放的别名列表。

如果每一个简单命令的第一个单词未被引起来,则会检查其是不是一个别名。如果是的,则这个单词会替换为别名的文本。字符“/”、“$”、“`”、“=”和 shell 元字符或是以上这些加上引号的字符不能出现在别名的名字中。别名中的替换文本可包含任意有效的 shell 输入,也包括 shell 元字符。会对别名的替换文本的第一个单词进行测试,但如果这个扩展后的单词与别名相同,则不会进行第二次扩展。这就是说,如果别名 ls 映射到“ls -F”的话,Bash 是不会再对替换文本中的 ls 再进行扩展。如果别名值中最后一个字符是空白,则跟在别名后的下一个命令单词也会进行别名扩展检查。

可以使用 alias 命令对别名进行创建和显示,使用 unalias 命令进行移除。

没有像在 csh 中那样,在替换文本中使用参数的机制。如果参数是必须出现的,则应该使用 shell 函数(参见 3.3《Shell 函数》)而不是别名。

如果 shell 未处于交互模式下时,别名是不会进行扩展的,除非使用 shopt 设置了“expand_aliases”选项(参见 4.3.2《内建命令 shopt》)。

涉及到别名的定义规则和使用规则时会有些混淆。Bash 总是会在执行单行命令或复合命令之前,读取至少一行的单行输入或读取组成复合命令的所有行。别名是在命令读取时进行扩展的,而不是在命令执行时。因此,别名定义作为另一个命令与别名扩展出现在同一行时,直到下一行输入读取后才会生效。与别名定义相同行后面的命令是不会受到新别名的影响的。同样在函数执行时,也有这个问题。别名是在读取函数定义时进行的扩展,而不是在函数执行时。因为函数定义本身就是一个命令。然而,在函数内部定义别名时,只有在函数执行后才可用。最安全的方式是,总是使用单独的一行进行别名定义,并且不要在复合命令中使用 alias 命令。

在大多数情况下,相比使用别名,更推荐使用 shell 函数。