3.5. 别名

3.5.1. 什么是别名?

别名允许一个字符串替代一个单词,当这个单词被用作简单命令的第一个单词时。shell 维护一个别名列表,可以使用内置命令 aliasunalias 来设置和取消设置。不带选项地执行 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 内置命令设置。

3.5.2. 创建和删除别名

别名使用 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 章

Tip函数更快
 

别名在函数之后查找,因此解析速度较慢。虽然别名更容易理解,但在几乎所有情况下,shell 函数都优于别名。