FreeBSD Shell 简介
shell 提供了一个与操作系统交互的命令行界面。shell 读取用户输入的命令并执行它们。许多 shell 提供了一些内置函数,如文件管理、文件通配符、命令行编辑、命令宏和环境变量。
FreeBSD 会默认安装了一些 shell,包括:
- Bourne shell (简称为
sh) - C shell (简称为
csh) - 扩展 C shell (简称为
tcsh),也称为 TENEX C Shell
其他 shell 可从 Package 或 FreeBSD Ports 集合安装,如 zsh 和 bash。
如何来选择使用哪种 shell:
- 一般可以根据个人的喜好选择。C 程序员可能更喜欢类似 C 的 shell,如
csh或tcsh。Linux 用户可能更喜欢bash。 - 根据工作环境选择。每个 shell 都有自己独特的属性,需要判断这些特性是否适合自己的工作环境。
Shell 的常用功能
几乎每一个Shell 都有这两个常用的功能:
- 命令和文件名自动补全
- 可设置环境变量
命令和文件名自动补全
在用户输入命令或文件名的前几个字符后按 Tab,shell 会自动补全命令或文件名的其余部分。
当补全的内容有多个选项时,不同的 Shell 有着不同的处理机制,这时可能无法直接补全,需要输入更多的字符。
环境变量
Shell 可以设置环境变量。环境变量是存储在 shell 环境中的键值对。在 Shell 中运行的命令都可以读取 Shell 中环境变量,因此可以用来为程序添加配置,供程序使用。
环境变量的名称始终为大写。
常见的环境变量
如下以表格的形式给出常见的环境变量:
| 变量 | 描述 |
|---|---|
| USER | 当前登录用户的名称 |
| PATH | 用于搜索二进制文件的路径目录,以冒号分隔多个目录 |
| DISPLAY | 连接的 Xorg 显示的网络名称 |
| SHELL | 当前 shell,以完整路径的形式给出 |
| TERM | 用户终端类型的名称,可用于确定终端的功能 |
| TERMCAP | 执行各种终端功能的终端转义码的数据库条目 |
| OSTYPE | 操作系统类型 |
| MACHTYPE | 系统的 CPU 架构 |
| EDITOR | 用户的文本编辑器 |
| PAGER | 用户的分页查看文本的实用程序 |
| MANPATH | 查找手册页的路径目录,以冒号分隔多个目录 |
设置环境变量
不同的 Shell 设置环境变量的方法不同:
1) tcsh 和 csh 使用 setenv 命令设置环境变量。
tcsh 将默认 EDITOR 设置为 /usr/local/bin/emacs:
% setenv EDITOR /usr/local/bin/emacs
2)sh 和 bash 使用 export 命令设置环境变量。
bash 将默认 EDITOR 设置为 /usr/local/bin/emacs:
$ export EDITOR="/usr/local/bin/emacs"
查看环境变量
在环境变量前添加前缀 $,来引用环境变量,使用 echo 命令可以输出环境变量的值:
使用 echo 查看 TERM 的值:
$ echo $TERM
输出类似如下的内容:
xterm
特殊字符
shell 将特殊字符称为元字符,它可以表示特殊数据。
最常见的元字符是 *,它表示文件名中的任意数量的字符。元字符可用于执行文件名通配符。
如何要输出特殊字符,需要对特殊字符进行转义,使用放斜杠 \ 转义字符。转义就是转变特殊字符的特殊意义为普通字符。
示例:输出 $ 字符,需要对字符转义:
$ echo \$
登录 Shell 与 非登录 Shell
登录 Shell 与 非登录 Shell 读取的配置文件是不同的。
登录 Shell(Login Shell)
登录 Shell 指用户登录时启动的第一个 Shell,以下方式运行的是登录 Shell:
- 通过 TTY 登录
- SSH 远程登录
- 运行命令
su - username(带横线)
非登录 Shell(Non-login Shell)
非登录 Shell 指在已经登录会话中启动的子 Shell,以下方式启动的 Shell 是非登录 Shell:
- 终端中直接运行 Shell 命令
- 在图形桌面中打开的终端
- 脚本执行时(#!/bin/zsh)
- 运行命令
su username(不带横线)
更换 Shell
更换默认使用的 shell 的最简单方法是使用 chsh (change shell 的缩写)命令。
1)推荐:运行 chsh 命令,使用 -s 选项,直接修改 shell:
$ chsh -s /usr/local/bin/bash
使用说明:
- 需要使用 shell 的完整路径
- 可以使用
whereis查看 shell 的完整路径,如whereis bash - 为了安全考虑,需要输入当前用户的密码
- 需要注销后重新登录,才能加载新 shell
2)运行 chsh 命令,不使用任何选项,将会使用默认编辑器(默认编辑器使用 EDITOR 环境变量配置)打开用户的配置信息:
$ chsh
在默认编辑器中显示类似如下信息:
#Changing user information for fu
Shell: /bin/sh
Full Name: FreeBSD user
Office Location:
Office Phone:
Home Phone:
Other information:
修改 Shell 行的内容为对应 Shell 的完整路径,如 修改为 csh,的路径 /bin/csh:
#Changing user information for fu
Shell: /bin/csh
Full Name: FreeBSD user
Office Location:
Office Phone:
Home Phone:
Other information:
默认情况下,使用如上的方式修改需要会使用 vi 编辑器。
可使用的 shell
要使用的 shell 必须包含在 /etc/shells 中,使用 Package 或 Ports 集安装的 shell,会自动把 shell 添加到该文件中。
如果要使用的 shell 不在 /etc/shells 文件中,使用如下方式把 shell 添加到文件中:
# echo /usr/local/bin/bash >> /etc/shells
重新运行 chsh 命令即可更换 shell。
高级 Shell 技术
Shell 不仅是一个命令解释器,还是一个强大的工具,允许用户执行命令,重定向其输入或输出,还可以将命令使用管道链接在一起。
1)重定向输出
shell 重定向输出是指将本来要输出到屏幕(标准输出)上的内容,输出到另一个命令或者一个文件中。
查看目录中的文件,将文件信息重定向到文件中:
$ ls > directory_listing.txt
2)重定向输入
shell 重定向输入是指将本来要从屏幕(标准输入)上读取内容,而是从另一个命令或者一个文件读取内容。
排序文件中的内容:
% sort < directory_listing.txt
3)文件描述符
在执行重定向时使用的是文件描述符。在 FreeBSD 系统中,有很多文件描述符,而标准输入(stdin)、标准输出(stdout)和标准错误(stderr)是基于 I/O 的文件描述符,有时也称为流。
4)管道操作符
也可以使用管道操作符重定向内容:
$ cat directory_listing.txt | sort | less
在该示例中,directory_listing.txt 的内容传递给 sort 排序,排序后传递给 less 分页查看。