首页>教程>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 分页查看。