Shell 概览

什么是 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 移植版
  • 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。

Shell 内置变量

Shell 内置命令

相关链接