本节概览
在 上一节 中我们了解了 Linux 的桌面环境,包括 GUI 、 TTY 和 VNC 等的介绍和使用。在本节中将介绍 Shell 是个什么东西,我们到底是如何通过 Shell 来操作计算机的,以及一些常见的 Shell 版本有哪些和它们有什么特点。
目录
- 本节概览
- Shell 到底是什么
- Shell 命令的执行流程
- 常见的 Shell 有哪些
- sh & bash
- zsh
- dash
- fish
Shell 到底是什么
Shell 是计算机操作系统中的一个命令行解释器,一般由C语言编写,用于用户与操作系统之间的交互。普通意义上的 Shell 就是指可以接受用户输入命令的程序。它之所以被称作 Shell 是因为它隐藏了操作系统低层的细节。同样的 Linux 下的图形用户界面GNOME 和 KDE,也被叫做“虚拟Shell”或“图形Shell”。
Shell 既是用户与内核交互的界面,同时也是一种控制计算机系统的脚本语言,相较于 Windows 下的 PowerShell 基本没多少人使用,Linux 下的系统控制、各种程序的解释等都是 Shell 来完成的。
如下图,当用户在 Shell 上输入命令后,Shell 将负责把命令转换成 kernel 能够理解的语句交给 kernel 来执行。
Shell 命令的执行流程
计算机系统中,当用户输入一条 Shell 命令时,Shell 会将其解析并通过操作系统执行,从而控制内核来完成相应的任务。以下是 Shell 命令的执行流程:
- 接受用户或者脚本输入:当用户输入命令或者通过脚本文件输入命令时,shell 将接受输入的字符串。
- 命令解析:Shell 将用户输入的命令字符串进行解析,识别出命令、参数和选项等部分;然后将解析到的命令按照预定的语法规则来解析,如果是内建命令(如 cd)则直接执行即可,而不调用系统命令解释器。
- 查找命令:对于非内建命令,Shell 会在环境变量 $PATH 指定的目录中查找相应的可执行文件,如果找到该文件,将首先确认其权限,确保用户有执行权限才能执行命令。
- 创建子进程:Shell 通过系统调用(如 fork)创建子进程并在其中执行命令。通过子进程执行命令可以确保命令执行不会受到当前父进程运行的影响,同时也方便控制命令的生命周期。
- 命令执行:子进程使用 exec 等系统调用将自己替换为指定的可执行程序,并加载该程序到内存中执行;同时在命令执行期间,Shell 还要负责处理管道、重定向符号等的运算。
- 等待命令完成:Shell 进入阻塞态以等待子进程执行完毕。此过程一般通过 wait 系统调用实现;但也可以选择将进程放入后台(使用后台执行关键符号 &),使得 Shell 无需等待该进程完成,直接返回新的输入提示符。
- 返回结果:当子进程执行完毕后,它会向 Shell 返回一个退出状态码,用以指示该命令的执行结果(如 0 表示成功,非零表示失败)。
- 销毁子进程:Shell 回收子进程资源,最后再检查是否还有需要处理的任务(如后台任务、信号等),然后返回提示符等待用户输入新的命令。
Shell 作为用户和内核之间的中介,将用户输入的文本命令转化为系统可以执行的操作,再借助系统调用控制硬件资源,从而完成用户的需求。
常见的 Shell 有哪些
sh & bash
sh(Bourne Shell) 是 Unix 系统上最早的 Shell,它由 AT&T 贝尔实验室的史蒂夫·伯恩在 1977 年在 Unix 中针对大学与学院发布的。它的二进制程序在大多数的 Unix 系统中位于 /bin/sh 目录下,后来的 Shell 都从它演化而来。它的功能虽然有限,但兼容性高,到现在仍然是许多脚本的标准 Shell。
bash(Bourne-Again SHell)是布莱恩·福克斯在 1987 年由为了 GNU 计划而编写的 Shell。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,由于其开源特性,所以几乎在所有 Linux 发行版中、早期 mac 电脑、现在 Windows wsl 子系统中都默认安装有它。bash 的命令语法是 sh 命令语法的超集。几乎各种 sh 脚本不经修改即可以在 bash 环境中执行,只有那些引用了 sh 特殊变量或内建命令的脚本才需要修改。
bash 官方网站:https://www.gnu.org/software/bash/
bash GitHub 地址:https://github.com/bminor/bash
zsh
zsh(Z Shell)是由保罗·弗斯塔德于 1990 年在普林斯顿大学求学时编写的。zsh 对 sh 做出了大量改进,同时加入了 bash、ksh及 tcsh 等其他各种 shell 的优秀功能。相比于其他的 shell,zsh 因其高度的定制化和强大的插件支持而闻名,截至目前,Oh My Zsh 这个网站提供了超过 300 个插件和 150 个主题,你可以在这个网站上找到你任何想要的插件和主题来 DIY 你的专属 shell。
zsh 官方网站:https://www.zsh.org/
zsh GitHub 仓库:https://github.com/zsh-users/zsh
dash
dash(Debian Almquist Shell)是一个轻量级、快速的 POSIX 兼容 Shell,主要设计目标是高效、快速地执行脚本而不是用户交互。它是由 NetBSD 上的 ash 发展而来的,并在 1997 年被移植到 Linux 上,同时在 2002 年更名为 dash。此 shell 因其执行速度快、占用资源少、完全兼容 POSIX 1 标准等特点,导致它在统脚本和启动脚本中应用广泛,但在日常使用中几乎很少看到它的身影。
dash 官方网站:http://gondor.apana.org.au/~herbert/dash/
dash 代码仓库:https://git.kernel.org/pub/scm/utils/dash/dash.git
fish
fish(Friendly Interactive Shell)是一种专注于用户体验的现代 Shell,最早由 Axel Liljencrantz 开发,并于 2005 年首次发布。它提供了丰富的交互功能和直观的设计,使 Shell 使用更加友好和便捷。相比如传统的 shell,它支持语法高亮、快捷键丰富、插件和主题支持也还行。总之,fish 是一种注重用户体验的 Shell,适合希望获得更直观和美观的命令行体验的用户,尤其是对日常命令行操作有较高要求但不需要严格 POSIX 兼容性的用户。
fish 官网网站:https://fishshell.com
fish GitHub 仓库:https://github.com/fish-shell/fish-shell
POSIX(Portable Operating System Interface for Unix)就是 便携式操作系统接口,是由 IEEE 制定的一组在 Unix 系统和其他类 Unix 操作系统提供统一的接口的标准。它规范了操作系统的 API、Shell 和工具,确保软件在符合 POSIX 的系统上可以跨平台运行。 ↩︎