1.5 查找并运行命令
1.5.1 问题
你需要在 bash 下查找并运行特定的命令。
1.5.2 解决方案
可以试试 type
、which
、apropos
、locate
、slocate
、find
和 ls
命令。
1.5.3 讨论
bash 会在环境变量 PATH
中保留一个用于查找命令的目录列表。内建命令 type
会在环境(包括别名、关键字、函数、内建命令、$PATH
中的目录以及命令散列表)中搜索匹配其参数的可执行文件并显示匹配结果的类型和位置。该命令有多个选项,其中值得注意的是 -a
,它会打印出所有的匹配结果,而不是只找出第一个匹配。which
命令与 type
类似,但它只搜索 $PATH
(以及 csh 别名)。在不同的系统中,which
的形式各异(通常在 BSD 中是一个 csh 脚本,但在 Linux 中是一个二进制文件),不过一般有 -a
选项。如果已知命令名,想知道其确切位置或想看看其是否存在于系统中,可以借助这两个命令。例如:
$ type which
which is hashed (/usr/bin/which)
$ type ls
ls is aliased to `ls -F -h'
$ type -a ls
ls is aliased to `ls -F -h'
ls is /bin/ls
$ which which
/usr/bin/which
几乎所有的命令都自带某种形式的用法帮助。通常采用的是称为手册页(manpage)的在线文档,其中 man 是 manual(手册)的简写。可以使用 man
命令访问这些手册页,man ls
会显示 ls
命令的相关文档。很多程序还有内建的帮助机制,通过 -h
或 --help
这样的“帮助”选项就能使用。尤其是在其他操作系统中的一些程序,如果不提供命令参数,就会直接显示帮助信息。部分 Unix 命令也会这么做,不过大多数没有这种功能。这是因为 Unix 命令还要组合起来形成管道,后面我们会讲到。但如果你不知道或忘记了命令名,该怎么办呢?apropos
命令可以根据所提供的正则表达式参数搜索手册页名称及描述。在你忘记所需要的命令名时,该命令尤其管用。它和 man -k
的效果一样:
$ apropos music
cms (4) - Creative Music System device driver
$ man -k music
cms (4) - Creative Music System device driver
locate
和 slocate
通过查询系统数据库文件(通常由调度程序 cron 运行的作业负责编译和更新)来查找文件或命令,几乎立刻就能得到结果。实际数据库文件的位置、索引内容、检查频率都因系统而异。具体细节可以查阅系统的手册页。slocate
(secure locate
)存储了权限信息(除文件名和路径之外),以免列出用户没有权限访问的程序。在多数 Linux 系统中,locate
是指向 slocate
的符号链接;在其他系统中,两者可能是不同的程序,也可能根本就没有 slocate
。以下就是一个示例:
$ locate apropos
/usr/bin/apropos
/usr/share/man/de/man1/apropos.1.gz
/usr/share/man/es/man1/apropos.1.gz
/usr/share/man/it/man1/apropos.1.gz
/usr/share/man/ja/man1/apropos.1.gz
/usr/share/man/man1/apropos.1.gz
有关 find
命令的细节,参见第 9 章。
最后同样重要的是 ls
命令。记住,如果你想要执行的命令位于当前目录,则必须在命令前加上 ./
,这是出于安全方面的考虑,因为当前目录通常并不在 $PATH
中(参见 14.3 节和 14.10 节)。
1.5.4 参考
help type
man which
man apropos
man locate
man slocate
man find
man ls
- 第 9 章
- 4.1 节
- 14.3 节
- 14.10 节