3.9. Shell

shell 提供了用于与操作系统交互的命令行接口。shell 接收来自输入通道的命令并执行这些命令。许多 shell 提供内置函数来帮助处理日常任务, 如文件管理、文件全球化、命令行编辑、命令宏和环境变量。FreeBSD配置集中shell可供选择, 包括Bourne shell (sh(1)) 和extended C shell (tcsh(1))。其他shell,如 zsh and bash可从FreeBSD ports集合中获得, 。

您想使用哪一种shell取决于您的喜好, 假如您是C程序设计师,您可能选择一个C-like shell例如tcsh。 假如您是从 Linux 过来的或是一个命令行的新手,您可能会试一下bash。 这一点告诉我们每一个shell都有各自的特性,可能适用于您的工作环境,也可能不适用于您的工作环境。

每个shell都有一个共通点就是文件名补全。 输入命令或文件名的前几个字,然后按Tab键,就能靠shell的自动补全功能得出 命令或文件名。这里有一个例子,假设您有两个文件叫 foobarfoo.bar,而您想删除 foo.bar, 可这样在键盘上输入 rm fo 然后按 Tab 来补全文件名。

但shell只显示rm foo。由于foobarfootball都以foo开始,因此无法补全文件名。如果多个名称匹配,则某些shell会发出蜂鸣声或显示所有选项。然后, 用户必须键入更多字符来标识所需的文件名。键入 t 并再次按 Tab 就足以让 shell 确定所需的文件名并填写其余文件。

Shell 的另一个功能是使用环境变量。环境变量是存储在 shell 环境中的变量/键对。此环境可以由 shell 调用的任何程序读取,因此包含大量程序配置。表 3.4 “常见环境变量”提供了常见环境变量及其含义的列表。请注意,环境变量的名称必须大写。

表 3.4. 常见环境变量
变量描述
USER当前登录进入的用户名。
PATH搜索程序路径,以两点的冒号分隔开。
DISPLAY假如有这个变量的话,就是Xorg显示器的网络名称。
SHELL当前所用的shell。
TERM用户终端的名字,通常用在确定终端的能力。
TERMCAP各种终端功能所用终端分离编码的基本数据项目。
OSTYPE操作系统类型,默认是FreeBSD。
MACHTYPE是指系统上运行的CPU体系结构。
EDITOR用户首选的文本编辑器。
PAGER用户首选的文本页面调度程序 。
MANPATH搜索联机手册路径,以两点的冒号分隔开。

不同的shell设置环境变量也不相同。举个例子, 在如tcshcsh这样的C-Style shell, 您必须使用setenv去设置环境变量。 而在如shbash这样的Bourne shell, 您必须使用export去设置当前环境变量。 再举个例子,要去设置或改变EDITOR环境变量, 在cshtcsh下将EDITOR设为 /usr/local/bin/emacs:

% setenv EDITOR /usr/local/bin/emacs

而在 bash 下,则是:

% export EDITOR="/usr/local/bin/emacs"

您也可以在命令行上加一个$字符在变量之前从而取得环境变量。 举个例子,用echo $TERM 就会显示出$TERM的设定值, 其实就是shell取得$TERM并传给echo来显示的。

Shell 将特殊字符(称为元字符)视为数据的特殊表示。最常见的元字符是*,它表示文件名中的任意数量的字符。元字符可用于执行文件名全局处理。例如,echo *相当于ls,因为 shell 接受所有匹配*的文件,并且echo在命令行中列出它们。

为了防止shell去分析这些特别字符, 我们可在它之前加一个 \字符去说明它只是普通字符。 echo $TERM就会显示出您的终端情况, 而 echo \$TERM 就会显示出 $TERM 这几个字。

3.9.1. 切换 Shell

改变您的Shell的最简单方法是使用 chsh 命令。 执行 chsh 将根据您设定的EDITOR 环境变量进入到那个编辑器,假如没有设定,就会进入vi编辑器。 请改变Shell:这行对应值。

您可使用 chsh -s, 这样就能设置您的shell却又不用编辑器。假如您想把 Shell 改为bash

% chsh -s /usr/local/bin/bash

注意:

您使用的shells必须/etc/shells 文件里列出。 假如您从 ports里装一个shell, 那就不用做这步了。 假如您手工装一个shell,那就要手工添加进去:

# echo /usr/local/bin/bash >> /etc/shells

然后运行chsh

3.9.2. 高级 Shell 使用技巧

Written by Tom Rhodes.

UNIX® Shell不只是指令的直译器,它是一个强大的工具可让使用者执行指令、重新导向指令的输出、重新导向指令的输入并将指令串连在一起来改进最终指令的输出结果。当这个功能与内置的指令混合使用时,可提供一个可以最佳化效率的环境给使用者。

Shell重新导向是将一个指令的输出或输入传送给另一个指令或档案。例如,要撷取ls(1)指令的输出到一个档案,可以重新导向输出:

% ls > directory_listing.txt

目录的内容现在会列到directory_listing.txt中,部份指令可以读取输入,例如sort(1)。要排序这个清单,可重新导向输入:

% sort < directory_listing.txt

输入的内容会被排序后呈现在画面上,要重新导向该输入到另一个档案,可以重新导向sort(1)的出输:

% sort < directory_listing.txt > sorted.txt

于上述所有的示例中,指令会透过档案描述符(File descriptor)来执行重新导向。每个UNIX®系统都有档案描述符,其中包含了标准输入(stdin)、标准输出(stdout)以及标准错误(stderr)。每一种档案描述符都有特定的用途,输入可能来自键盘或鼠标、任何可能提供输入的来源,输出则可能是屏幕或打印机中的纸张,而错误则为任何可能用来诊断的信息或错误讯息。这三种皆被认为是以I/O为基础的档案描述符,有些也会被当做串流。

透过使用这些档案描述符,Shell能够让输出与输入在各种指令间传递与重新导向到或自档案。另一种重新导向的方式是使用管线运算子(Pipe operator)。

UNIX®的管线运算子,即|,可允许指令的输出可直接传递或导向到另一个程序。基本上,管线运算子允许指令的标准输出以标准输入传递给另一个指令,例如:

% cat directory_listing.txt | sort | less

在这个例子中,directory_listing.txt的内容会被排序然后输出传递给less(1),这可让使用者依自己的阅读步调卷动输出的结果,避免结果直接卷动出画面。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.