01 JAN

命令别名:定义自己的命令并保护和服务

学习如何创建别名:你可以将太长或难以记忆的命令打包成你自己构建的命令。

命令别名Alias在 Linux shell 中指的是将一些太长或者太难记的多个命令组合起来,成为一个由用户自己构建的命令。

别名即快捷方式

Linux shell 最美妙的事情之一是可以使用数以万计的选项和把命令连接在一起执行真正复杂的操作。好吧,也许这种美丽是在旁观者的眼中的,但是我们觉得这个功能很实用。

不利的一面是,你经常需要记得难以记忆或难以打字出来的命令组合。比如说硬盘上的空间非常宝贵,而你想要做一些清洁工作。你的第一步可能是寻找隐藏在你的家目录里的东西。你可以用来判断的一个标准是查找不再使用的内容。ls 可以帮助你:

ls -lct

上面的命令显示了每个文件和目录的详细信息(-l),并显示了每一项上次访问的时间(-c),然后它按从最近访问到最少访问的顺序排序这个列表(-t)。

这难以记住吗?你可能不会每天都使用 -c 和 -t 选项,所以也许是吧。无论如何,定义一个别名,如:

alias lt='ls -lct'

会更容易一些。

然后,你也可能希望列表首先显示最旧的文件:

alias lo='lt -F | tac'

长治

图 1:使用 lt 和 lo 别名。

这里有一些有趣的事情。首先,我们使用别名(lt)来创建另一个别名 —— 这是完全可以的。其次,我们将一个新参数传递给 lt(后者又通过 lt 别名的定义传递给了 ls)。

-F 选项会将特殊符号附加到项目的名称后,以便更好地区分常规文件(没有符号)和可执行文件(附加了 *)、目录文件(以 / 结尾),以及所有链接文件、符号链接文件(以 @ 符号结尾)等等。-F 选项是当你回归到单色终端的日子里,没有其他方法可以轻松看到列表项之间的差异时用的。在这里使用它是因为当你将输出从 lt 传递到 tac 时,你会丢失 ls 的颜色。

第三件我们需要注意的事情是我们使用了管道。管道用于你将一个命令的输出传递给另外一个命令时。第二个命令可以使用这些输出作为它的输入。在包括 Bash 在内的许多 shell 里,你可以使用管道符(|) 来做传递。

在这里,你将来自 lt -F 的输出导给 tactac 这个命令有点玩笑的意思,你或许听说过 cat命令,它名义上用于将文件彼此连接(concat),而在实践中,它被用于将一个文件的内容打印到终端。tac 做的事情一样,但是它是以逆序将接收到的内容输出出来。明白了吗?cat和 tac,技术人有时候也挺有趣的。

cat 和 tac 都能输出通过管道传递过来的内容,在这里,也就是一个按时间顺序排序的文件列表。

那么,在有些离题之后,最终我们得到的就是这个列表将当前目录中的文件和目录以新鲜度的逆序列出(即老的在前)。

最后你需要注意的是,当在当前目录或任何目录运行 lt 时:

# 这可以工作:lt# 这也可以:lt /some/other/directory

……而 lo 只能在当前目录奏效:

# 这可工作:lo# 而这不行:lo /some/other/directory

这是因为 Bash 会展开别名的组分。当你键入:

lt /some/other/directory

Bash 实际上运行的是:

ls -lct /some/other/directory

这是一个有效的 Bash 命令。

而当你键入:

lo /some/other/directory

Bash 试图运行:

ls -lct -F | tac /some/other/directory

这不是一个有效的命令,主要是因为 /some/other/directory 是个目录,而 cat 和 tac 不能用于目录。

可以直接使用的命令别名

实际上,执行不带任何内容的 alias 命令就可以看到当前已经设定的所有命令别名。对于不同的发行版,包含的命令别名不尽相同,但普遍都会有以下这些命令别名:

  • alias ls='ls --color=auto':这个命令别名在前面已经提到过了。--color=auto 参数会让 ls 命令在通过标准输出在终端中显示内容时进行着色,而其它情况(例如通过管道输出到文件)下则不进行着色。--color 这个参数还可以设置为 always 或never

  • alias cp='cp -i'-i 参数代表“

    交互interactive

    ”。在使用 cp 命令复制文件的时候,可能会无意中覆盖现有的文件,在使用了 -i 参数之后,cp 命令会在一些关键操作前向用户发出询问。

  • alias free='free -m':在 free 命令后面加上 -m 参数,就可以将输出的内存信息以 MiB 这个更方面阅读和计算的单位输出,而不是默认的 Byte 单位。

你使用的发行版自带的命令别名可能多多少少和上面有些差别。但你都可以在命令前面加上 \ 修饰符来使用命令的最基本形式(而不是别名)。例如:

\free

就是直接执行 free,而不是 free -m。还有:

\ls

执行的就是不带有--color=auto 参数的 ls

如果想要持久地保存命令别名,可以在 .bashrc 文件中进行修改,而它来源于我们的 /etc/skel 目录

使用命令别名纠正错误

各种发行版的设计者都会尽量设置用户可能需要用到的命令别名。但是不同的用户的习惯各不相同,一些用户可能刚从其它操作系统迁移到 Linux,而不同操作系统的基本命令又因 shell 而异。因此,对于刚从 Windows/MS-DOS 系统迁移到 Linux 系统的用户,不妨使用

alias dir='ls'

这个命令别名来列出目录内容。

类似地,

alias copy='cp'alias move='mv'

也可以在尚未完全熟悉 Linux 的时候用得顺手。

还有一种情况,就是在经常出现输入错误的场合中做出容错,例如,对于我来说, Administration 这个单词就很难快速正确地输入,因此很多用户都会设置类似这样的别名:

alias sl='ls'

以及

alias gerp='echo "You did it *again*!"; grep'

grep 命令最基本的用途就是在文件中查找字符串,在熟悉这个命令之后,它一定是最常用的命令之一,因此输入错误导致不得不重输命令就很令人抓狂。

在上面 gerp 的例子中,包含的不只是一条命令,而是两条。第一条命令 echo "You did it *again*!" 输出了一条提醒用户拼写错误的消息,然后使用分号()把两条命令隔开,再往后才是 grep 这一条正确的命令。

在我的系统上使用 gerp 来搜索 /etc/skel/.bashrc 中包含“alias”这个单词的行,就会输出以下内容:

$ gerp -R alias /etc/skel/.bashrcYou did it *again*!        alias ls='ls --color=auto'        alias grep='grep --colour=auto'        alias egrep='egrep --colour=auto'        alias fgrep='fgrep --colour=auto' alias cp="cp -i"alias df='df -h'alias free='free -m'alias np='nano -w PKGBUILD' alias more=less shopt -s expand_aliases

在命令别名中以固定的顺序执行多个命令,甚至更进一步,把多个命令串连起来,让后面的命令可以使用到前面的命令的执行结果。这样的做法已经非常接近 bash 脚本了。这篇文章已经接近尾声,我们将在下一篇文章中详细介绍。

如果想要删除在终端中临时设置的别名,可以使用 unalias 命令。

unalias gerp

长治


更多的别名快捷方式

  • alias lll='ls -R' 会打印出目录的内容,并深入到子目录里面打印子目录的内容,以及子目录的子目录,等等。这是一个查看一个目录下所有内容的方式。

  • mkdir='mkdir -pv' 可以让你一次性创建目录下的目录。按照 mkdir 的基本形式,要创建一个包含子目录的目录,你必须这样:

mkdir newdirmkdir newdir/subdir

或这样:

mkdir -p newdir/subdir

而用这个别名你将只需要这样就行:

mkdir newdir/subdir

你的新 mkdir 也会告诉你创建子目录时都做了什么。

别名也是一种保护

别名的另一个好处是它可以作为防止你意外地删除或覆写已有的文件的保护措施。你可能听说过这个 Linux 新用户的传言,当他们以 root 身份运行:

rm -rf /

整个系统就爆了。而决定输入如下命令的用户:

rm -rf /some/directory/ *

就很好地干掉了他们的家目录的全部内容。这里不小心键入的目录和 * 之间的那个空格有时候很容易就会被忽视掉。

这两种情况我们都可以通过 alias rm='rm -i' 别名来避免。-i 选项会使 rm 询问用户是否真的要做这个操作,在你对你的文件系统做出不可弥补的损失之前给你第二次机会。

如果想要持久保存命令别名,可以将命令别名放在用户主目录的 .bashrc 文件中。