使用命令
摘要:本章内容聚焦于命令,将介绍命令的四种形式,如何识别命令属于哪一种形式,以及在知道命令属于哪种形式后如何获取它的相关文档,最后还会讲述如何用别名创建自己的命令。
使用命令
这一章将介绍以下命令:
- type –说明怎样解释一个命令名
- which –显示会执行哪个可执行程序
- man –显示命令手册页
- apropos –显示一系列适合的命令
- info –显示命令 info
- whatis –显示一个命令的简洁描述
- alias –创建命令别名
到底什么是命令
命令具有以下四种形式:
-
是一个可执行程序。
这一类程序可以是用诸如 C 和 C++ 语言写成的程序编译的二进制文件,也可以是由诸如 shell,perl,
python,ruby 等等脚本语言写成的程序。 -
是一个内建于 shell 自身的命令。
bash 支持若干命令,内部叫做 shell 内部命令 (builtins)。例如,cd 命令,就是一个 shell 内部命令。
-
是一个 shell 函数。
这些是小规模的 shell 脚本,它们混合到环境变量中。
-
是一个命令别名。
我们可以定义自己的命令,建立在其它命令之上。
识别命令
为了确切地知道正在使用四类命令中的哪一类,Linux 提供了两种方法来弄明白命令类型。
type - 显示命令的类型
type
命令是 shell 内部命令,它会显示命令的类别。用法如下:
type command //“command” 是你要检测的命令名
实例:
xuxg@xuxg-ubuntu:~$ type type
type is a shell builtin
xuxg@xuxg-ubuntu:~$ type ls
ls is aliased to `ls --color=auto'
xuxg@xuxg-ubuntu:~$ type cp
cp is /bin/cp
我们看到这三个不同命令的检测结果。注意,ls
命令(在Ubuntu系统中)的检查结果,ls
命令实际上是 ls
命令加上选项--color=tty
的别名。现在我们知道为什么ls
的输出结果是有颜色的!
which - 显示一个可执行程序的位置
为了确定所给定的可执行程序的准确位置,使用 which
命令:
xuxg@xuxg-ubuntu:~$ which ls
/bin/ls
**which
命令只对可执行程序有效,不包括shell 内部命令 (builtins)和命令别名。**在Ubuntu系统中,which
一个shell内部命令是得不到回应的。
得到命令文档
知道了什么是命令,现在我们来寻找每一类命令的可得到的文档。
help - 得到 shell 内建命令的帮助文档
输入help
,接着是 shell 内部命令名。例如:
xuxg@xuxg-ubuntu:~$ help cd
cd: cd [-L|[-P [-e]] [-@]] [dir]
Change the shell working directory.
...(省略)
注意表示法:出现在命令语法说明中的方括号,表示可选的项目。一个竖杠字符表示互斥选项。
–help - 显示用法信息
许多可执行程序支持一个--help
选项,这个选项是显示命令所支持的语法和选项说明。例如:
xuxg@xuxg-ubuntu:~$ mkdir --help
Usage: mkdir [OPTION]... DIRECTORY...
Create the DIRECTORY(ies), if they do not already exist.
...(省略)
一些程序不支持
--help
选项,但不管怎样试一下。这经常会导致输出错误信息,但同时能揭示一样的命令用法信息。
man - 显示可执行程序手册页
许多希望被命令行使用的可执行程序,提供了一个正式的文档,叫做手册或手册页 (man page)。一个叫做man
的分页程序,可用来浏览手册。例如:
xuxg@xuxg-ubuntu:~$ man ls
在大多数 Linux 系统中,man
使用less
工具来显示参考手册,所以当浏览文档时,你所熟悉的less
命令都能有效。
man
只对可执行程序和命令别名有效,对shell内部命令无效。
man
一下passwd
这个命令,在弹出的手册页左右上角会看到PASSWD(1)
,这个(1)
代表什么?答:
man
所显示的参考手册,被分成几个章节,它们不仅仅包括用户命令,也包括系统管理员命令、程序接口、文件格式等等。下表描绘了手册的布局:
章节 内容 1 用户命令 2 程序接口内核系统调用 3 C 库函数程序接口 4 特殊文件,比如说设备结点和驱动程序 5 文件格式 6 游戏娱乐,如屏幕保护程序 7 其他方面 8 系统管理员命令 这个
(1)
代表着我们现在打开的是passwd
的第1章节:用户命令。如果我们输入以下命令:man 5 passwd
就会看到左右上角有
PASSWD(5)
,打开的就是passwd
的第五章节:文件格式,显示的是文件/etc/passwd
的文件格式说明手册。
apropos - 显示适当的命令
也有可能搜索参考手册列表,基于某个关键字的匹配项。虽然很粗糙但有时很有用。下面是一个以 floppy
为关键词来搜索参考手册的例子:
xuxg@xuxg-ubuntu:~$ apropos floppy
fdformat (8) - low-level format a floppy disk
mbadblocks (1) - tests a floppy disk, and marks the bad blocks in the FAT
mformat (1) - add an MSDOS filesystem to a low-level formatted flopp...
mxtar (1) - Wrapper for using GNU tar directly from a floppy disk
输出结果每行的第一个字段是手册页的名字,第二个字段展示章节,第三字段是手册页中NAME一项中带有关键词floopy
的那一行命令说明的展示。我们把输出的四个结果都用man
命令打开对应章节看一下:
FDFORMAT(8) System Administration FDFORMAT(8)
NAME
fdformat - low-level format a floppy disk
mbadblocks(1) General Commands Manual mbadblocks(1)
Name
mbadblocks - tests a floppy disk, and marks the bad blocks in the FAT
mformat(1) General Commands Manual mformat(1)
Name
mformat - add an MSDOS filesystem to a low-level formatted floppy disk
MXTAR(1) Mtools Users Manual MXTAR(1)
NAME
mxtar - Wrapper for using GNU tar directly from a floppy disk
注意,
man
命令加上-k
选项,和apropos
完成一样的功能。
whatis - 显示非常简洁的命令说明
whatis
程序显示匹配特定关键字的手册页的名字和一行命令说明:
xuxg@xuxg-ubuntu:~$ whatis ls
ls (1) - list directory contents
info -显示程序 Info 条目
GNU 项目提供了一个命令程序手册页的替代物,称为 info
。info 内容可通过 info 阅读器程序读取。info 页是超级链接形式的,和网页很相似。
info 程序读取 info 文件,info 文件是树型结构,分化为各个结点,每一个包含一个题目。info 文件包含超级链接,它可以让你从一个结点跳到另一个结点。一个超级链接可通过它开头的星号来辨别出来,把光标放在它上面并按下enter
键,就可以激活它。
输入 info
,接着输入程序名称,启动 info。下表中的命令,当显示一个 info 页面时,用来控制阅读器。
命令 | 行为 |
---|---|
? | 显示命令帮助 |
PgUp or Backspace | 显示上一页 |
PgDn or Space | 显示下一页 |
n | 下一个 - 显示下一个结点 |
p | 上一个 - 显示上一个结点 |
u | Up - 显示当前所显示结点的父结点,通常是个菜单 |
Enter | 激活光标位置下的超级链接 |
q | 退出 |
到目前为止,我们所讨论的大多数命令行程序,属于 GNU 项目
coreutils”
包,输入info coreutils
将会显示一个包含超级链接的手册页,这些超级链接指向包含在 coreutils 包中的各个程序。
README 和其它程序文档
许多安装在系统中的软件,都有自己的文档文件,这些文件位于/usr/share/doc
目录下。
这些文件大多数是以文本文件的形式存储的,可用 less 阅读器来浏览。
一些文件是 HTML 格式,可用网页浏览器来阅读。
可能遇到许多以 .gz
结尾的文件。这表示 gzip 压缩程序已经压缩了这些文件。gzip 软件包包括一个特殊的 less 版本,叫做zless
,zless
可以显示由 gzip 压缩的文本文件的内容。
小总结
help
只能得到shell内部命令的帮助文档。man
和info
只能用来得到可执行程序和命令别名的文档,whatis
也只能得到可执行程序和命令别名的一句话简介。--help
选项大部分命令都可以用。
用别名(alias)创建你自己的命令
在开始之前,我们需要展示一个命令行小技巧。可以把多个命令放在同一行上,命令之间用 ;
分开。如:
xuxg@xuxg-ubuntu:~$ cd /usr; ls; cd -
bin games include lib libexec local sbin share src
/home/xuxg
xuxg@xuxg-ubuntu:~$
在一行上联合了三个命令。首先更改目录到/usr
,然后列出目录内容,最后回到原始目录(用命令 cd -
),结束在开始的地方。
现在,通过 alias
命令把这一串命令转变为一个命令。
-
给新命令想个名字,就叫
test
吧。 -
查明是否
test
命令名已在系统中存在。xuxg@xuxg-ubuntu:~$ type test test is a shell builtin
-
test
名字已经被使用了。试一下foo
:xuxg@xuxg-ubuntu:~$ type foo bash: type: foo: not found
-
foo
还没被占用。创建命令别名:xuxg@xuxg-ubuntu:~$ alias foo='cd /usr; ls; cd -'
注意命令结构:
alias name='string'
在命令
alias
之后,输入name
,紧接着(没有空格)是一个等号,等号之后是一串用引号引起的字符串,字符串的内容要赋值给name
。 -
我们定义了别名之后,这个命令别名可以使用在任何地方。
xuxg@xuxg-ubuntu:~$ foo bin games include lib libexec local sbin share src /home/xuxg xuxg@xuxg-ubuntu:~$
-
也可以使用
type
命令来查看我们的别名:xuxg@xuxg-ubuntu:~$ type foo foo is aliased to `cd /usr; ls; cd -'
-
删除别名,使用
unalias
命令:xuxg@xuxg-ubuntu:~$ unalias foo xuxg@xuxg-ubuntu:~$ type foo bash: type: foo: not found
要查看所有定义在系统环境中的别名,使用不带参数的alias
命令。
xuxg@xuxg-ubuntu:~$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
在命令行中定义别名有点儿小问题。当你的 shell 会话结束时,它们会消失。随后的章节里,我们会了解怎样把自己的别名添加到文件中去,每次我们登录系统,这些文件会建立系统环境。
总结
已经学习了怎样找到命令的帮助文档,那就试着查阅到目前为止我们学到的所有命令的文档。学习命令其它可用的选项,练习一下!