首页 > 教程 > FreeBSD 教程 > FreeBSD 基础 > FreeBSD Shell 简介

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,如 cshtcsh。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) tcshcsh 使用 setenv 命令设置环境变量。

tcsh 将默认 EDITOR 设置为 /usr/local/bin/emacs

% setenv EDITOR /usr/local/bin/emacs

2)shbash 使用 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 分页查看。