6.6 别名

评论 0 浏览 0 2023-01-26

别名允许一个字符串在被用作简单命令的第一个词时被替换。 shell维护了一个别名列表,可以通过aliasunalias内置命令来设置和取消。

每个简单命令的第一个词,如果没有引号,将被检查是否有一个别名。 如果有,该词将被别名的文本所取代。字符‘/’, ‘$’, ‘`’, ‘=’ 以及上面列出的任何shell元字符或引号字符都不能出现在别名名称中。 替代文本可能包含任何有效的shell输入,包括shell元字符。替换文本的第一个字会被测试是否有别名, 但与正在扩展的别名相同的字不会被第二次扩展。这意味着可以将ls别名为"ls -F",例如,Bash不会尝试递归地扩展替换文本。如果别名值的最后一个字符是blank,那么别名后面的下一个命令字也会被检查为别名扩展。

别名是用alias命令创建和列出的,用unalias命令删除的。

在替换文本中没有使用参数的机制,如csh。 如果需要参数,请使用shell函数(见3.3 Shell函数)。

当shell不是交互式的时候,别名不会被展开,除非使用shopt设置了expand_aliasesshell选项(见2 Shopt 内置程序)。

关于别名的定义和使用的规则有点令人困惑。Bash在执行该行或该复合命令的任何命令之前,总是至少要读取完整的一行输入,以及组成复合命令的所有行。 别名是在读取命令时展开的,而不是在执行命令时。因此,与另一条命令出现在同一行的别名定义直到下一行输入被读取时才会生效。 该行别名定义后面的命令不会受到新别名的影响。 当函数被执行时,这种行为也是一个问题。 别名在函数定义被读取时被展开,而不是在函数被执行时,因为函数定义本身就是一条命令。因此,在一个函数中定义的别名在该函数被执行后才会可用。为了安全起见,总是把别名定义放在单独的一行,并且不要在复合命令中使用alias

对于几乎所有的目的来说,shell函数都比别名更受欢迎。

最后更新2023-02-20
0 个评论
上一篇: 6.5 shell算术
下一篇: 6.7 数组
当前页面书签