bash shell脚本编程经典实例(第2版)
上QQ阅读APP看书,第一时间看更新

1.5 查找并运行命令

1.5.1 问题

你需要在 bash 下查找并运行特定的命令。

1.5.2 解决方案

可以试试 typewhichaproposlocateslocatefindls 命令。

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

locateslocate 通过查询系统数据库文件(通常由调度程序 cron 运行的作业负责编译和更新)来查找文件或命令,几乎立刻就能得到结果。实际数据库文件的位置、索引内容、检查频率都因系统而异。具体细节可以查阅系统的手册页。slocatesecure 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 节