3.9.Shell
shell 提供了一个命令行界面,用于与操作系统进行交互。Shell 从输入通道接收命令并执行它们。许多 shell 提供了内置函数来帮助处理日常任务,如文件管理,文件 globbing,命令行编辑,命令宏和环境变量。FreeBSD 自带几种 shell,包括 Bourne shell(sh(1))和扩展的 C shell(tcsh(1))。其他 shell 可以从 FreeBSD Ports 中获取,比如 zsh 和 bash。
shell 的选择实际上是个人口味问题。C 程序员可能会觉得用类似 C 的 shell(如 tcsh(1))更舒适。Linux® 用户可能更喜欢 bash。每个 shell 都有其特性,可能与用户偏好的工作环境相符,也可能不相符,这就是为什么可以对使用哪种 shell 进行选择。
shell 的常见功能是文件名补全。用户输入命令或文件名的前几个字母后按 Tab 键,shell 会自动补全命令或文件名的剩余部分。考虑两个名为 foobar 和 football 的文件。要删除 foobar,用户可输入 rm foo,然后按 Tab 键来补全文件名。
但 shell 只显示 rm foo。它无法完成文件名自动补全,因为 foobar 和 football 都以 foo 开头。有些 shell 会发出哔哔声或显示所有匹配项,如果有多个名称匹配。用户必须继续输入更多字符以确定所需的文件名。输入 t 并再次按 Tab 键足以让 shell 确定期望的文件名并填写其余部分。
shell 的另一个特性是使用环境变量。环境变量是存储在 shell 环境中的变量/键对。这个环境可以被 shell 调用的任何程序读取,因此包含大量程序配置。常见的环境变量提供了常见环境变量及其含义的列表。请注意,环境变量的名称始终大写。
表 6. 常见的环境变量
如何在不同 shell 之间设置环境变量不同。在 tcsh(1)和 csh(1)中,使用setenv
来设置环境变量。在 sh(1)和 bash 中,使用export
来设置当前的环境变量。此示例将 tcsh(1) shell 的默认 EDITOR 设置为 /usr/local/bin/emacs :
bash 的等效命令是:
要扩展环境变量以查看其当前设置,请在命令行中其名称前面输入一个 $ 字符。例如,echo $TERM 会显示当前的 $TERM 设置。
shell 将特殊字符(称为元字符)视为数据的特殊表示。最常见的元字符是 *
,它表示文件名中的任意数量字符。元字符可用于执行文件名通配。例如,echo *
等同于 ls,因为 shell 获取所有匹配 *
和 echo 的文件,并将它们列在命令行上。
为防止 shell 解释特殊字符,可以通过在特殊字符前加上反斜杠( \
)来使其脱离 shell。例如,echo $TERM 打印终端设置,而 echo $TERM 字面打印字符串 $TERM。
3.9.1. 更改 Shell
永久修改默认 shell 的最简单方法是使用 chsh。运行此命令将打开配置在 EDITOR 环境变量中的编辑器,默认情况下设置为 vi(1)。将 Shell: 行更改为新 shell 的完整路径。
或者,使用 chsh -s,它将设置指定的 shell 而不会打开编辑器。例如,要将 shell 更改为 bash :
在提示处输入密码并按回车键以修改你的 shell。注销然后重新登录以开始使用新的 shell。
3.9.2。高级 Shell 技术
UNIX® shell 不仅仅是一个命令解释器,它还是一个强大的工具,能让用户执行命令,重定向它们的输出,重定向它们的输入,并链接命令以改善最终的命令输出。当这种功能与内置命令混合在一起时,用户将获得一个可以最大化效率的环境。
shell 重定向是将命令的输出或输入发送到另一个命令或文件的操作。例如,要将 ls(1)命令的输出捕获到一个文件中,请将输出重定向到:
现在将列出目录内容 directory_listing.txt。有些命令可用于读取输入,比如 sort(1)。要对此列表进行排序,请重定向输入:
输入将被排序并显示在屏幕上。要将该输入重定向到另一个文件,可以通过混合方向重定向 sort(1)的输出:
在所有之前的示例中,命令都在使用文件描述符执行重定向。每个 UNIX®系统都有文件描述符,其中包括标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。每个都有一个目的,其中输入可以是键盘和鼠标等提供输入的东西。输出可以是屏幕和打印机上的纸。错误将是用于诊断或错误消息的任何内容。所有三个都被视为基于 I/O 的文件描述符,有时被视为流。
通过使用这些描述符,shell 能通过各种命令传递输出和输入,并将其重定向到文件中。另一种重定向的方法是管道运算符。
UNIX®管道运算符"|"能把将一个命令的输出直接传递或定向到另一个程序。基本上,管道能把一个命令的标准输出作为另一个命令的标准输入,例如:
在该示例中,directory_listing.txt 的内容将被排序,并将输出传递给 less(1)。这能让用户按自己的节奏浏览输出并防止其滚动到屏幕外。
最后更新于