别名允许一个字符串替代一个单词,当这个单词被用作简单命令的第一个单词时。shell 维护一个别名列表,可以使用内置命令 alias 和 unalias 来设置和取消设置。不带选项地执行 alias 可以显示当前 shell 已知的别名列表。
franky: ~> alias alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..' alias PAGER='less -r' alias Txterm='export TERM=xterm' alias XARGS='xargs -r' alias cdrecord='cdrecord -dev 0,0,0 -speed=8' alias e='vi' alias egrep='grep -E' alias ewformat='fdformat -n /dev/fd0u1743; ewfsck' alias fgrep='grep -F' alias ftp='ncftp -d15' alias h='history 10' alias fformat='fdformat /dev/fd0H1440' alias j='jobs -l' alias ksane='setterm -reset' alias ls='ls -F --color=auto' alias m='less' alias md='mkdir' alias od='od -Ax -ta -txC' alias p='pstree -p' alias ping='ping -vc1' alias sb='ssh blubber' alias sl='ls' alias ss='ssh octarine' alias tar='gtar' alias tmp='cd /tmp' alias unaliasall='unalias -a' alias vi='eval `resize`;vi' alias vt100='export TERM=vt100' alias which='type' alias xt='xterm -bg black -fg white &' franky ~> |
别名对于指定系统上多个版本命令的默认版本,或者指定命令的默认选项非常有用。别名的另一个用途是纠正不正确的拼写。
每个简单命令的第一个单词,如果未被引号引用,则会检查它是否具有别名。如果有,则该单词将被别名的文本替换。别名名称和替换文本可以包含任何有效的 shell 输入,包括 shell 元字符,但别名名称不能包含 "="。替换文本的第一个单词会再次检查别名,但是与正在展开的别名相同的单词不会再次展开。这意味着,例如,可以将 ls 别名为 ls -F,而 Bash 不会尝试递归地展开替换文本。如果别名值的最后一个字符是空格或制表符,则别名后的下一个命令单词也会被检查是否需要别名展开。
当 shell 不是交互式时,别名不会被展开,除非expand_aliases选项使用 shopt shell 内置命令设置。
别名使用 alias shell 内置命令创建。为了永久使用,请在您的 shell 初始化文件中输入 alias;如果您只是在命令行中输入别名,则它仅在当前 shell 中被识别。
franky ~> alias dh='df -h' franky ~> dh Filesystem Size Used Avail Use% Mounted on /dev/hda7 1.3G 272M 1018M 22% / /dev/hda1 121M 9.4M 105M 9% /boot /dev/hda2 13G 8.7G 3.7G 70% /home /dev/hda3 13G 5.3G 7.1G 43% /opt none 243M 0 243M 0% /dev/shm /dev/hda6 3.9G 3.2G 572M 85% /usr /dev/hda5 5.2G 4.3G 725M 86% /var franky ~> unalias dh franky ~> dh bash: dh: command not found franky ~> |
Bash 始终至少读取完整的一行输入,然后才执行该行上的任何命令。别名在读取命令时展开,而不是在执行命令时展开。因此,与另一个命令出现在同一行上的别名定义,直到读取下一行输入才会生效。该行上别名定义之后的命令不受新别名的影响。当执行函数时,此行为也是一个问题。别名在读取函数定义时展开,而不是在执行函数时展开,因为函数定义本身就是一个复合命令。因此,在函数中定义的别名在该函数执行后才可用。为了安全起见,始终将别名定义放在单独的行上,并且不要在复合命令中使用 alias。
别名不会被子进程继承。Bourne shell (sh) 不识别别名。
有关函数的更多信息,请参见第 11 章。
![]() | 函数更快 |
---|---|
别名在函数之后查找,因此解析速度较慢。虽然别名更容易理解,但在几乎所有情况下,shell 函数都优于别名。 |