什么是 Shell
在操作系统中,shell 是用于访问操作系统服务的一种用户界面(User Interface),分为命令行界面(Command-Line Interface, CLI)和图形用户界面(Graphical User Interface, GUI)两类。现如今提到 shell 时,一般指代命令行式 shell,它是一个命令解释器,可以解释、执行用户输入的命令,与操作系统进行通信,除此以外它也是一种编程语言。
常见 Shell
Unix/BSD/Linux:
- Thompson shell: 第一款 Unix shell
- Bourne shell, B-shell,
sh
: Version 7 Unix 默认 shell - C shell, C-shell,
csh
tcsh
: C shell 增强版
- Korn shell, K-shell,
ksh
: 基于 Bourne shell - Bash, Bourne-again shell,
bash
: Bourne shell 扩展版,包含 Korn shell 和 C shell 的部分功能rbash
: restricted bash
- Almquist shell, A Shell,
ash
: Bourne shell 的变种- Debian Almquist shell,
dash
: Almquist shell 的 Linux 移植版
- Debian Almquist shell,
- Zsh, Z shell,
zsh
: Bourne shell 扩展版 - fish shell,
fish
: 号称“friendly interactive shell”,和 Bourne shell/C shell 不兼容
目前主流的 shell 大都是在 Bourne shell 的基础上发展而来,尤其是 Bash,大部分类 Unix 操作系统都把它作为系统默认 shell。当然也有一些系统因为软件体积、运行速度或者许可证之类的的原因,切换成其他 shell。比如 Ubuntu 从 6.10 开始,使用 dash 代替 Bash 作为默认 shell。macOS 从 10.15 Catalina 开始,使用 Zsh 代替 Bash 作为默认 shell。
Windows 系统中的命令提示符(Command Prompt,cmd)和 PowerShell 有别于类 Unix 系统的 shell,它们不仅是命令行解释器,同时也是终端(Terminal)。当然,Windows 系统默认没有内置 Bash 等 shell,如果要使用,可以安装 Cygwin 和 MinGW 移植版,或者 WSL。
查看系统可用的 Shell
在 macOS 10.15 上:
$ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.
/bin/bash
/bin/csh
/usr/local/bin/fish
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
其中的 fish 为手动安装。
在 Ubuntu 18.04 上:
$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/bin/rbash
/bin/dash
查看当前使用的 Shell
# 显示当前使用的 shell
$ ps | grep $$ | awk '{print $4}'
bash
# 显示用户默认的 shell,但不一定是当前使用的 shell
$ echo $SHELL
/bin/bash
# 查看是否是 login shell(Bash 内置,在 Zsh 中无法使用)
$ shopt login_shell
login_shell off
Shell 与 REPL
REPL 即 Read Eval Print Loop,是一个交互式的编程环境,与 Unix shell 类似,不少编程语言的运行时都支持,如 Python、Ruby、Lua、Java(从 Java 9 开始引入 JShell)、JavaScript(Node.js)。
Shell 标准
从 shell 的发展过程可以看出 Bourne shell 成为了事实上的标准,或者说成为了标准的基础,sh-compatible/Bourne-compatible 是我们在选择 shell 时的一个重要考量因素,很多历史 shell 脚本中的 shebang 都写作 #!/bin/sh
(正如 Web 浏览器中的 User Agent 都把自己声明为 Mozilla、KHTML、Gecko)。
Shell 的具体规范包含在 POSIX 标准中,POSIX 标准对应 IEEE 1003.1 和 ISO/IEC 9945。