5.2 使用别名

别名是命令行下最常用的省时技巧之一。它通过对频繁使用的命令及选项重新定义一个较短的名称,从而使我们能够减少输入,最终达到提高操作效率的目的。让我们先来看看如何定义别名。

5.2.1 定义别名

不管是 bash,还是 zsh,它们都能使用 alias 命令来定义别名。例如,假如我们要将 ls -lah --color=auto 定义成 l 的话,那么可以执行下列命令:

xiaodong@codeland:~$ alias l='ls -lah --color=auto'

代替输入长长的 ls -lsh 命令,现在我们只需直接执行 l 即可。

xiaodong@codeland:~$ l

比较常见的别名定义包括下面这些:

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias ls='ls --color=auto'
alias l='ls -lah --color=auto'
alias la='ls -AF --color=auto'
alias ll='ls -lFh --color=auto'

除了节省时间,利用别名我们也可以避免经常性的输入错误。如果你常常将 ls 错输成 sl,那么不妨为它定义一个别名:

xiaodong@codeland:~$ alias sl='ls'

在 zsh 中,alias 命令还能用 -s 选项来定义后缀别名。例如,当我们将文件扩展名 pdf 定义成 zathura 后缀别名后,直接执行 pdf 文件名,就会调用 zathura 打开该 pdf 文件。

xiaodong@codeland:~$ alias -s pdf=zathura
xiaodong@codeland:~$ cheat_sheet_ssh_v4.pdf

在这个例子中,我们通过执行 cheat_sheet_ssh_v4.pdf 来代替执行 zathura cheat_sheet_ssh_v4.pdf 命令。

5.2.2 查看别名

时间久了,也许你将忘记所定义别名的具体内容。为了查看别名 sd 的内容,我们将它作为参数传递给 alias 命令:

xiaodong@codeland:~$ alias sd
alias sd='shutdown -h now'

alias 列出的内容,我们知道 sdshutdown -h now 的别名。

alias 命令也可以不带任何参数,直接予以执行则会列出当前 Shell 中的所有别名。

xiaodong@codeland:~$ alias

5.2.3 取消别名

如果某个别名不再适用,那么我们可以使用 unalias 命令来取消它。

xiaodong@codeland:~$ unalias sl

执行 unalias sl 命令后,将取消我们先前定义的 sl 别名。

xiaodong@codeland:~$ sl

此时我们再执行 sl 就不是列出当前工作目录的内容了。

比永久取消别名更加有用的一个技巧是临时取消别名。

xiaodong@codeland:~$ ls
xiaodong@codeland:~$ \ls

第一次 ls 执行的是别名,第二次我们在 ls 前面放了一个 \ (反斜杠),用来临时取消别名。请比较两个命令先后执行的输出结果。

此外,unalias 命令还支持 -a 选项,利用这个选项可以移除所有定义的别名。

xiaodong@codeland:~$ unalias -a

5.2.4 别名的缺憾

使用别名固然好,但它也有一些缺憾。一方面,别名无法参数化,打算实现一个参数化别名的想法注定会失败。这时候,你应当考虑使用的是函数。另一方面,别名可能覆盖真实的命令,从而误导你原本想要执行命令的意图。

通过 type -a 我们可以确定别名极其真实的命令:

xiaodong@codeland:~$ type -a sl
sl is aliased to `ls'
sl is /usr/bin/sl
sl is /sbin/sl
sl is /usr/sbin/sl

这里,我们既能看到 slls 的别名,也能看到它有一个真实的命令。