上节讲到了FreeBSD UNIX基础指南。本篇教程再次深入讲解FreeBSD UNIX进阶使用指南,包括文件系统的挂接和卸下、进程操作、Shells、文本编辑器、设备和设备节点、二进制文件格式等等。
一、文件系统的挂接和卸下
在计算机系统中,文件系统的结构就像一棵树,其中根目录是 “/”,而其他目录如 “/dev”、”/usr” 等则是其分支。这种层次结构让文件系统更为理想化。为了避免根文件系统被过度填充,建议将某些目录分离出来,例如将 “/var” 目录从根目录中独立出来,因为 “/var” 下包含 “log/”、”spool/” 等目录以及临时文件,容易导致空间不足。
此外物理设备或虚拟磁盘也应有明确的挂接目录结构,这包括网络文件系统或光驱的挂接设置。
二、fstab文件
在引导过程中,系统会自动挂接 “/etc/fstab” 文件中列出的文件系统(除非指定了 “noauto” 选项)。”/etc/fstab” 文件的行格式如下:
device /mount-point fstype options dumpfreq passno
1、device:设备名称(必须存在),指明要挂接的设备。
2、mount-point:挂接点(目录必须存在),这是文件系统挂接到的目录。
3、fstype:文件系统类型,FreeBSD 默认的文件系统类型是 “ufs”。
4、options:可读写选项,如 “rw”(可读写)或 “ro”(只读),以及其他选项。常用的 “noauto” 选项用于不在引导时自动挂接的文件系统。
5、dumpfreq:”dump(8)” 使用该项决定文件系统是否需要备份。如果缺少该项,默认值为 0。
6、passno:决定文件系统检查的顺序。跳过检查的文件系统应将 “passno” 设为 0,根文件系统应设为 1,其他文件系统则需设为大于 1 的值。如果多个文件系统的 “passno” 相同,”fsck(8)” 会尽可能并行检查这些文件系统。
三、mount命令
“mount(8)” 命令是挂接文件系统的主要工具,其基本用法为:
# mount device mountpoint
该命令有多种选项,常用的包括:
1、”-a”:挂接 “/etc/fstab” 中所有列出的文件系统,除非标记为 “noauto” 或被排除。
2、”-d”:仅进行调试,结合 “-v” 参数使用,可以查看 “mount(8)” 的操作。
3、”-f”:强制挂接未知文件系统(风险较高),或在将文件系统从可读写状态降为只读时强制撤销可写权限。
4、”-r”:以只读方式挂接文件系统,效果与指定 “-o ro” 相同。
5、”-t fstype”:根据给定的文件系统类型挂接文件系统,若使用 “-a” 选项,仅挂接此类型的文件系统。
6、”-u”:修改已挂接文件系统的选项。
7、”-v”:版本模式。
8、”-w”:以可读写方式挂接文件系统。
9、”-o” 选项允许使用逗号分隔的多个选项,如:
10、”noexec”:禁止在文件系统上执行二进制程序,增加安全性。
11、”nosuid”:禁止 setuid 和 setgid 标记生效,提高安全性。
四、umount命令
“umount(8)” 命令用于卸下挂接的文件系统,其用法为:
umount [options] <mountpoint|device>
可以使用 “-a” 卸下所有已挂接的文件系统,或使用 “-A” 选项。所有格式都可以添加 “-f” 强行卸下,或者使用 “-v” 获取详细信息。但需谨慎,强行卸下可能导致数据损坏。
通过 “-a” 和 “-A” 可卸下所有已挂接的文件系统,并且可以通过 “-t” 后面列出的文件系统进行选择,但 “-A” 不会尝试卸下根文件系统。
五、进程
FreeBSD 是一个多任务操作系统,这意味着它能够同时运行多个程序。每个占用一定时间的程序被称为进程(process)。在命令行中输入的每个命令至少会启动一个新进程,同时系统中还有许多后台进程,用以维护系统的正常运行。
每个进程都有一个唯一的标识符,称为进程 ID(PID)。类似于文件,每个进程也有其所属用户和用户组,这些信息用于确定进程可以访问哪些文件和设备,从而影响其权限。大多数进程都有一个父进程,进程是由其父进程启动的。例如,当在 shell 中输入命令时,shell 就是这些命令的父进程。唯一的例外是 init 进程,它始终是第一个启动的进程,PID 始终为 1,init 由内核在 FreeBSD 启动时自动创建。
在系统中,有两个非常有用的命令用于观察进程:”ps” 和 “top”。”ps” 命令用于查看当前运行进程的状态,包括它们的 PID、内存使用情况以及启动时的命令行。而 “top” 命令则以秒为单位实时更新并显示所有正在运行的进程,提供交互式监控计算机的功能。
默认情况下,”ps” 仅显示自己运行的命令。例如:
% ps PID TT STAT TIME COMMAND 298 p0 Ss 0:01.10 tcsh 7078 p0 S 2:40.88 xemacs mdoc.xsl (xemacs-21.1.14) 37393 p0 I 0:03.11 xemacs freebsd.dsl (xemacs-21.1.14) 48630 p0 S 2:50.89 /usr/local/lib/netscape-linux/navigator-linux-4.77.bi 48730 p0 IW 0:00.00 (dns helper) (navigator-linux-) 72210 p0 R+ 0:00.00 ps 390 p1 Is 0:01.14 tcsh 7059 p2 Is+ 1:36.18 /usr/local/bin/mutt -y 6688 p3 IWs 0:00.00 tcsh 10735 p4 IWs 0:00.00 tcsh 20256 p5 IWs 0:00.00 tcsh 262 v0 IWs 0:00.00 -tcsh (tcsh) 270 v0 IW+ 0:00.00 /bin/sh /usr/X11R6/bin/startx -- -bpp 16 280 v0 IW+ 0:00.00 xinit /home/nik/.xinitrc -- -bpp 16 284 v0 IW 0:00.00 /bin/sh /home/nik/.xinitrc 285 v0 S 0:38.45 /usr/X11R6/bin/sawfish
在这个例子中,”ps” 输出的每一列都有特定含义。PID 为进程 ID,这个编号从 1 开始递增到 99999,超出后会循环使用(已在用的 PID 不会被重新分配)。”TT” 列显示程序运行所在的终端,可以暂时忽略。”STAT” 列表示程序的状态,也可以略过。”TIME” 是程序在 CPU 上处理的总时间,而不是从启动到现在的总耗时。最后,”COMMAND” 列显示运行程序时所用的命令行。
“ps” 支持多种选项以改变输出内容,其中最有用的是 “auxww”。选项 “a” 显示所有运行的进程,而不仅限于进程;”u” 显示归属用户及内存使用情况;”x” 显示后台进程;”ww” 确保显示完整的命令行,不会因过长而截断。
下面是 “top” 命令的示例输出:
% top last pid: 72257; load averages: 0.13, 0.09, 0.03 up 0+13:38:33 22:39:10 47 processes: 1 running, 46 sleeping CPU states: 12.6% user, 0.0% nice, 7.8% system, 0.0% interrupt, 79.7% idle Mem: 36M Active, 5256K Inact, 13M Wired, 6312K Cache, 15M Buf, 408K Free Swap: 256M Total, 38M Used, 217M Free, 15% Inuse PID USERNAME PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND 72257 nik 28 0 1960K 1044K RUN 0:00 14.86% 1.42% top 7078 nik 2 0 15280K 10960K select 2:54 0.88% 0.88% xemacs-21.1.14 281 nik 2 0 18636K 7112K select 5:36 0.73% 0.73% XF86_SVGA 296 nik 2 0 3240K 1644K select 0:12 0.05% 0.05% xterm 48630 nik 2 0 29816K 9148K select 3:18 0.00% 0.00% navigator-linu 175 root 2 0 924K 252K select 1:41 0.00% 0.00% syslogd 7059 nik 2 0 7260K 4644K poll 1:38 0.00% 0.00% mutt ...
输出分为两部分。前面部分(起始的五行)显示了最后进程的 PID、系统负载均衡(表示系统繁忙时的调节方式)、系统已运行时间(从启动至今的时间)和当前时间。此外,还显示了正在运行的进程数量(例如:47),内存及交换区的使用情况,以及系统在不同 CPU 状态下的时间消耗。
接下来的列与 “ps” 输出的信息相似:PID、用户名、CPU 总处理时间和运行的命令。”top” 默认显示的内存使用分为两列,一列为整体大小,另一列为实际驻留大小。在上面的例子中,某个进程可能请求了 30 MB 的内存,但实际上只使用了 9 MB。
六、守护进程、信号与杀死进程
当运行一个编辑器时,可以轻松地控制它,例如告诉它加载某个文件。这是因为编辑器提供了这样的便利,并且它与终端相连接。然而,有些程序在运行时不需要持续的用户输入,它们可以在有机会时从终端分离到后台。例如,Web 服务器全天候处理请求,而无需用户输入。另一个例子是电子邮件的发送。
这类程序称为守护进程。在希腊神话中,守护神是一种非正非邪的小精灵,通常为人类服务。许多类似于 Web 服务或邮件服务的系统至今仍然有效,因此 BSD 的吉祥物常常表现为一双鞋加一把叉子的守护神形象。
守护进程的名称通常以 “d” 结尾。例如,BIND 是伯克利互联网域名服务,其执行程序名称为 “named”;Apache 的 Web 服务器程序名为 “httpd”;而行式打印机的打印守护进程则称为 “lpd”。这只是一种惯例,而非标准或强制规定。例如,Sendmail 的主要邮件守护进程名为 “sendmail”,而不是 “maild”。
某些情况下,可能需要与守护进程进行通信,而信号是一种通信机制。可以向守护进程(或其他相关进程)发送信号来进行交流,各种信号都有自己的数字编号,其中一些具有特定含义,其他的则由应用程序定义。一般来说,应用程序文档会说明哪些信号会被如何处理。只能向属于自己的进程发送信号,若尝试向其他人的进程发送,系统将拒绝该操作,通常需用 “kill(1)” 或 “kill(2)” 权限。不过,root 用户可以向所有进程发送信号。
在某些情况下,FreeBSD 也会向应用程序发送信号。例如,当一个应用程序出现恶意写入并尝试访问不可用内存时,FreeBSD 会向其发送段式违规信号(SIGSEGV)。如果应用程序使用 “alarm(3)” 系统调用设置定时器,达到时间时,FreeBSD 也会发送闹钟信号(SIGALRM)。
有两个信号可以用于停止进程:SIGTERM 和 SIGKILL。”SIGTERM” 是比较温和的信号,进程可以捕捉并根据需要优雅地关闭。在关闭之前,进程可以完成打开的日志文件并结束正在进行的任务。然而,如果进程不响应或被设计为忽略此信号,可能无法停止。
相比之下,”SIGKILL” 信号是强制性的,进程无法忽略。发送 “SIGKILL” 信号后,FreeBSD 会立即终止该进程。
也可能会使用 “SIGHUP”、”SIGUSR1” 和 “SIGUSR2” 等信号。这些都是通用信号,各种应用程序可以根据需要使用。
例如更改了 Web 系统的配置文件并希望系统重新加载配置,不一定需要停止然后重启 “httpd”,因为这样会造成短暂的服务中断,这通常是不受欢迎的。几乎所有守护进程在编写时会指定对 “SIGHUP” 信号的响应,以便重读配置文件。因此,最佳方法是向其发送 “SIGHUP” 信号,而不是重启 “httpd”。由于没有统一的标准,不同的守护进程对信号的处理方式可能不同,因此在不确定的情况下应查阅相关文档。
操作步骤:发送信号给进程
以下示例展示了如何向 “inetd(8)” 发送信号。假设 “inetd” 的配置文件位于 “/etc/inetd.conf”,想让 “inetd” 重读该文件,可以向它发送 “SIGHUP” 信号。
首先,找到要发送信号的进程 ID,可以使用 “ps(1)” 加 “grep(1)” 来实现。”grep(1)” 命令用于搜索输出内容,寻找指定的字符串。由于 “inetd(8)” 是由 root 用户运行的,因此需要使用 “ax” 选项来查看所有进程。
% ps -ax | grep inetd 198 ?? IWs 0:00.00 inetd -wW
这里,我们获得了 “inetd(8)” 的 PID(进程 ID)为 198。有时 “grep inetd” 也会出现在输出中,因为 “ps(1)” 会列出所有运行的进程。
接下来,使用 “kill(1)” 发送信号。由于 “inetd(8)” 是由 root 启动的,需要使用 “su(1)” 切换到 root 用户。
% su Password: # /bin/kill -s HUP 198
与大多数 UNIX® 命令一样,如果 “kill(1)” 成功执行,将不会返回任何消息。如果尝试向不属于进程发送信号,会看到 “kill: PID: Operation not permitted.” 的提示。如果错误地输入了 PID,将信号发送到其他进程,那将是一个错误。而如果发送到不存在的进程,会看到 “kill: PID: No such process.” 的提示。
为什么使用 “/bin/kill”?
许多 shell 提供了内置的 “kill” 命令,这样 shell 能直接发送信号,而无需运行 “/bin/kill”。虽然这很方便,但不同的 shell 对发送信号的语法有所不同,因此学习所有语法可能不如简单地使用 “/bin/kill” 来得直观。
发送其他信号也是类似的,只需在命令行中替换相应的信号名称(如 “TERM” 或 “KILL”)。随意杀死系统进程是一个坏主意,尤其是 “init(8)” 进程,其 PID 为 1,具有特殊意义。如果运行 “/bin/kill -s KILL 1” 命令,系统将迅速关机。因此,在运行 “kill(1)” 时,一定要仔细检查指定的参数。
七、Shells
在FreeBSD中,许多日常工作都是通过命令行界面完成的,这就是所谓的shell。一个shell的主要功能是接收用户输入的命令并执行它们。许多shell还提供内建的功能,例如文件管理、文件查找、命令行编辑、宏指令和环境变量。FreeBSD内置了几种shell,如sh、Bourne Shell、tcsh和改良版的C-shell。此外,还有一些shell可以在FreeBSD的Ports中获取,例如zsh和。
选择使用哪种shell取决于个人偏好。如果是C程序设计师,可能会选择类似C语言风格的shell,例如tcsh。如果是从Linux转来或对命令行不太熟悉,可能会尝试。这表明每种shell都有其独特的特性,可能更适合某些工作环境。
所有shell的一个共通特点是文件名补全。可以输入命令或文件名的前几个字母,然后按Tab键,利用shell的自动补全功能。例如,如果有两个文件叫做foobar和foo.bar,而想删除foo.bar,可以输入:
rm fo[Tab].[Tab]
此时,shell会输出 “rm foo[BEEP].bar”。这个[BEEP]是控制台发出的提示音,表示无法完成文件名补全,因为多个文件名匹配。由于foobar和foo.bar都以fo开头,shell只能补全到foo。再输入”.”并再次按Tab,shell会显示所有匹配的文件名。
另一个重要特性是shell通过环境变量进行操作。环境变量存储在shell的环境空间中,以键值对的形式存在,供程序读取,并包含许多程序的配置。以下是一些常用环境变量及其说明:
不同的shell设置环境变量的方式各有不同。例如,在tcsh和csh这类C风格的shell中,需要使用”setenv”来设置环境变量;而在sh和这样的Bourne shell中,则需要使用”export”。例如,要设置或修改EDITOR环境变量,在csh或tcsh下可以这样做:
% setenv EDITOR /usr/local/bin/emacs
而在Bourne shell下则为:
% export EDITOR="/usr/local/bin/emacs"
还可以在命令行上加上$字符来获取环境变量。例如,输入”echo $TERM”会显示$TERM的当前值;而输入”echo \$TERM”则会显示”$TERM”这个字符串。
shell中有许多特殊字符代表特定的含义,我们称之为meta-characters。最常用的是”*”字符,它可以代表文件名中的任意字符。这些特殊字符用于文件名的匹配。例如,输入”echo *”和输入”ls”的效果是相同的,实际上是shell将所有符合”*”的文件名传递给”echo”进行显示。
为了防止shell解析这些特殊字符,可以在它们前面加上”\”字符,表示它们只是普通字符。例如,”echo $TERM”会显示终端信息,而”echo \$TERM”则会显示”$TERM”。
八、改变使用的Shell
改变shell的最简单方式是使用”chsh”命令。执行”chsh”后,会根据设置的EDITOR环境变量打开相应的编辑器,如果没有设置,则会使用vi编辑器。在编辑器中,可以修改”Shell:”那一行对应的值。
也可以使用”chsh -s”选项来直接改变shell,而无需进入编辑器。如果想将shell改为,可以使用以下命令:
% chsh -s /usr/local/bin/
所使用的shell必须在”/etc/shells”文件中列出。如果从Ports安装shell,则无需此步骤;但如果手动安装shell,则需要手动添加。例如,如果手动将安装到”/usr/local/bin”,还需要运行以下命令:
# echo "/usr/local/bin/" >> /etc/shells
然后再运行”chsh”命令。
九、文本编辑器
在 FreeBSD 中,许多配置可以通过编辑文本文件进行,因此熟悉一种文本编辑器非常重要。FreeBSD 基本系统中提供了一些编辑器,也可以从 Ports Collection 安装其他编辑器。
最容易上手的编辑器是 “ee” 编辑器,它是一种标准的简易编辑器。要启动 “ee”,请在命令行输入 “ee filename”,其中 “filename” 是要编辑的文件名。例如,要编辑 “/etc/rc.conf”,需输入 “ee /etc/rc.conf”。在 “ee” 的界面中,编辑器的所有功能操作方法都在顶部显示。这里的 “^” 字符代表键盘上的 Ctrl 键,因此 “^e” 就是指 Ctrl+e 组合键。如果想要退出 “ee”,可以按 Esc 键并选择退出。修改内容后,编辑器会提示保存更改。
FreeBSD 还提供了功能强大的文本编辑器,如 “vi”。此外,还可以在 FreeBSD Ports 中找到其他如 “emacs” 和 “vim” 等编辑器。这些编辑器功能强大,但学习曲线相对较陡。如果从事文本编辑工作,掌握像 “vim” 或 “emacs” 这样的高级编辑器将帮助在长时间的工作中节省不少时间。
许多需要修改文件或进行文本输入的应用程序会自动打开一个文本编辑器。要更改默认使用的编辑器,需要设置 “EDITOR” 环境变量。
十、设备和设备节点
在一个系统中,硬件通常用特定的术语描述,每个设备对应一个名称,包括磁盘、打印机、显卡和键盘。在 FreeBSD 启动过程中,大多数设备会被检测到并显示,可以查看 “/var/run/dmesg.boot” 以获取引导时的详细信息。
例如:”acd0″ 表示第一个 IDE 光盘设备,而 “kbd0” 则代表键盘。在 UNIX® 操作系统中,大多数设备都有特殊的访问文件,称为设备节点,这些节点位于 “/dev” 目录下。
十一、 建立设备节点
在系统中添加新设备或将附加设备的支持编译进内核后,都必须为其建立设备节点。
DEVFS (DEVice 文件系统):设备文件系统(DEVFS)为内核中的设备命名提供了通道,它并不是用于建立或更改设备节点,而是维护特定的文件系统。
十二、二进制文件格式
要理解为什么 FreeBSD 使用 ELF (Executable and Linkable Format) 格式,必须首先了解 UNIX® 系统中的三种主要可执行文件格式的相关知识:
1、a.out(5)
这是最古老和“经典的” UNIX® 目标文件格式。它的文件开头有一个短小而紧凑的头部,带有一个魔数(magic number)用于标识具体格式。该格式包含三个需加载入内存的段:”.text”、”.data” 和 “.bss”,以及一个符号表和一个字符串表。
2、COFF
COFF(Common Object File Format)是 SVR3 的目标文件格式。其文件头包括一个区段表(section table),因此除了 “.text”、”.data” 和 “.bss” 段外,还可以包含其他区段。
3、ELF(5)
ELF 是 COFF 的继承者,其特点是支持多个区段,并可以使用 32 位或 64 位的值。其主要缺点是,在设计时假设每个系统架构只有一种 ABI(应用程序二进制接口),这一假设在实际中并不成立,尤其是在商业化的 SYSV 环境中(例如,SVR4、Solaris、SCO 等至少有三种 ABI)。
FreeBSD 在一定程度上解决了这个问题,提供了一种工具来识别已知 ELF 可执行文件所遵循的 ABI 信息。
FreeBSD 起源于“经典”阵营,因此最初使用 a.out 格式,许多 BSD 版本的发布(直到 3.X 分支开始)证明了该格式的有效性。尽管早期在 FreeBSD 系统上创建和运行 ELF 格式的二进制可执行文件(和内核)是可能的,但 FreeBSD 一开始并没有积极转向 ELF 格式。这是因为当 Linux 阵营完成了向 ELF 格式迁移的艰难历程后,他们发现仅仅放弃 a.out 格式并不足以解决问题,正是由于 a.out 格式灵活性不足且基于跳转表的共享库机制让开发者构建共享库变得困难。直到已有的 ELF 工具提供了恰当的解决方案,大家才普遍认为这是一种“前进方向”,从而接受了迁移的代价,并最终完成了这一过程。FreeBSD 的共享库机制更类似于 Sun SunOS™ 的共享库机制,因此其易用性得到了很好的提升。
为什么会有这么多不同的格式?
回溯到早期简单硬件的时代,那时的系统结构简单。对于这些简单系统(如 PDP-11),a.out 格式已足够表达二进制文件。当 UNIX® 被移植到更复杂的硬件(如 Motorola 68k 和 VAX 系列)时,a.out 格式被保留,因为它仍然能满足基本需求。
随着 RISC 架构的出现,一些工程师意识到通过让软件处理简单操作可以简化硬件设计。因此,a.out 格式在这种新型硬件上显得不太适用,人们设计了许多新的格式以获得更好的性能,例如 COFF 和 ECOFF 等。经过对这些格式局限性的研究,ELF 格式最终应运而生。
与此同时,程序的规模不断增加,而磁盘空间和物理内存相对有限,因此共享库的概念开始产生。虚拟内存系统也变得愈发复杂。在 a.out 格式的基础上,为了满足新的需求,人们对其进行了一系列修改。尽管这些调整在某一阶段是可行的,但随着时间推移,a.out 格式不得不承担越来越多的复杂性。ELF 格式则解决了许多这些问题。然而,从一个可用系统迁移到另一个系统的过程往往十分痛苦,因此,直到继续保留 a.out 格式的成本高于迁移到 ELF 格式的成本时,人们才最终选择了后者。
随着时间的发展,FreeBSD 系统的编译工具(特别是汇编器和链接器)形成了两个平行的分支。FreeBSD 分支增加了共享库,并修复了一些错误,而原先编写这些工具的 GNU 团队则重写了工具并增强了对交叉编译的支持,随意插入了对不同格式的支持。尽管很多人希望创建针对 FreeBSD 的交叉编译器,但由于 FreeBSD 的 “as” 和 “ld” 的源代码较为陈旧,这一任务未能如愿。新的 GNU 工具链(binutils)确实支持交叉编译、ELF 格式、共享库及 C++ 扩展等功能。由于许多供应商发布 ELF 格式的二进制文件,因此让 FreeBSD 能够运行这些文件显得尤为重要。
ELF 格式相比 a.out 格式开销稍大,但它允许基础系统有更好的扩展性。ELF 相关工具维护性更佳,并提供交叉编译支持,这对许多用户而言至关重要。虽然 ELF 格式可能稍微慢一些,但实测很难察觉。此外,两者之间存在许多细节上的不同,例如映射页面的方式、初始化代码的处理方式等等。尽管这些差异看似不重要,但确实是两者的不同之处。未来,GENERIC 内核将不再支持 a.out 格式,当不再需要运行遗留的 a.out 程序时,内核也将停止对其的支持。
十三、获取更多信息
1、在线手册
FreeBSD 中最详细的使用说明文档就是在线手册。几乎每个程序都有简短的说明,介绍其基本功能和参数用法。我们可以通过 “man” 命令来阅读这些说明,使用方法非常简单:
% man command
其中 “command” 是想了解的命令名称。例如,若想了解 “ls” 命令,可以输入:
% man ls
这些在线手册分为以下几个章节:
- 用户命令
- 系统调用及错误代码
- C 库文件中的函数说明
- 设备驱动程序
- 文件格式
- 游戏及其他娱乐
- 各种信息
- 系统维护及命令
- 内核开发情况
在某些情况下,同一主题可能出现在不同章节中。例如,系统中有 “chmod” 用户命令,同时也有 “chmod()” 系统调用。在这种情况下,应该向 “man” 命令指定所需内容:
% man 1 chmod
这样会显示用户 “chmod” 命令的手册。传统上,我们在文档中以括号注明特定的详细参考内容,因此 “chmod(1)” 指 “chmod” 用户命令,而 “chmod(2)” 指系统调用。
如果已经知道命令名称但不知道如何使用,可以利用 “man” 的搜索功能,它会在手册的介绍部分查找要找的关键字,选项为 “-k”:
% man -k mail
使用此命令时,”man” 会列出介绍中含有“mail”关键字的命令,实际上这与 “apropos” 命令的功能相同。
有时,可能会看到 “/usr/bin” 下有很多命令却不知其用途,这时可以使用:
% cd /usr/bin % man -f *
或者:
% cd /usr/bin % whatis *
这两个命令的功能相同。
2、GNU Info文件
FreeBSD 的许多应用软件和实用工具来自自由软件基金会(FSF)。作为手册的补充,这些程序提供了一种更动态的超文档说明,即 “info” 文件,可以使用 “info” 命令来阅读它们。如果安装了 Emacs,也可以使用 Emacs 的 info 模式来阅读。
使用 “info(1)” 命令只需简单输入:
% info
想获取简单介绍,请按 “h”。想快速得到命令说明,请按 “?”。