跳至主要内容

什么是 Shell?

了解什么是 Shell,以及学习它如何让您成为更高效、更全能的数据科学家。
Wendy Gittleson
Wendy Gittleson

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续继续即表示您接受我们的 使用条款,我们的 隐私政策 ,并且您的数据存储在美国。

计算机脚本图形

如果您使用的是 Microsoft、Apple 或 Linux 操作系统(OS),您很可能在不知不觉中就在使用 shell 脚本。事实上,每次启动 Linux 操作系统,您都会与 shell 进行交互。

Shell 脚本通过自动化,帮助程序员、数据科学家和普通用户节省时间,避免重复性工作。例如,脚本可以执行每日备份、安装补丁、监控系统及活动,并进行常规审计。

Shell 能读取相对直观、面向人的命令,并将其转换为系统可以理解的内容。

什么是 Shell?

Shell 是一种称为命令行解释器的计算机程序,允许 Linux 和 Unix 用户通过命令行界面控制其操作系统。Shell 使用户能够高效且直接地与操作系统进行通信。

Shell 脚本并不是单一语言,但由于它使用了一些自然语言式的命令,即便没有编程背景也很容易上手。不过,每一种 shell 脚本变体都可以视为一门语言;如果您计划编写更复杂的脚本,就需要大量练习。

Shell 脚本是搭建自动化的最简单方式之一。借助 Linux 或 Unix 命令,Shell 为数据科学家、DevOps 和 TechOps 提供条件与循环控制结构,以便重复执行命令。

Shell 脚本并不总是同名。sh、Bash(最常见)、csh 和 tesh 都是 shell 脚本。在 IBM 的 VM 操作系统中,它们被称为 EXEC;在 DOS 中,shell 脚本被称为批处理文件(batch files)。

Shell 有两类:命令行 shell 和图形 shell。命令行 shell 通过命令行界面访问,系统以人类可读的命令接收输入,并通过命令行界面显示输出。

图形 shell 使用图形用户界面(GUI)来执行交互与基本操作,例如打开、关闭和保存文件。

以下是一些示例 shell 命令:

查看当前所在目录:pwd

在手册中查找某个命令:man command

将文本文件以可滚动方式查看:less file 1 或 more file 1

不同类型的 Shell

Bourne Shell

尽管名字很酷,Bourne shell 与间谍或高速飙车并无关系。Bourne shell 是第二常用的 Unix shell,由 Stephen Bourne 于 1979 年在贝尔实验室创建。与其前身 Thompson shell 一样,Bourne 的可执行文件名为 sh。

Bourne shell 是 Solaris 操作系统的默认 shell。尽管年代久远,Bourne shell 至今仍受欢迎,原因在于其速度快、体积小。但它的交互性不强,无法调用其命令历史,也缺乏逻辑与算术表达能力。

Bourne 提示符包括:

  • 命令完整路径:/bin/sh 和 /sbin/sh
  • 非 root 用户默认提示符:$
  • root 用户默认提示符:#

命令行

C shell,文件名为 csh,以及其前身文件名 tcsh,是 70 年代末期的另一种 Unix shell。它由当时就读于加州大学伯克利分校的研究生 Bill Joy 创建。

与 Bourne shell 不同,C shell 具有交互性,并支持命令历史和别名。C shell 还包含类似 C 的表达式语法和内置算术运算。

命令行提示符包括:

  • 命令完整路径:/bin/csh
  • 非 root 用户默认主机名提示符:%
  • root 用户默认主机名提示符:#

KornShell

KornShell,文件名为 ksh,由 David Korn 在 20 世纪 80 年代初于贝尔实验室开发。KornShell 包含了 C shell 的许多功能,并且是 Bourne shell 的超集,因此向后兼容 Bourne shell。

KornShell 运行速度比 C shell 更快。它能运行 Bourne shell 脚本,并提供类似 C 的数组、函数和字符串处理功能。此外,它还具备内置算术运算。

KornShell 提示符包括:

  • 命令完整路径:/bin/ksh
  • 非 root 用户默认提示符:$
  • root 用户默认提示符:#

GNU Bourne-Again shell

GNU Bourne-Again,或称 Bash,是 Bourne shell 的开源替代方案。它由 Brian Fox 为 GNU 项目设计,并于 1989 年发布。它不仅与 Bourne shell 完全兼容,还吸收了 KornShell 和 C shell 的诸多优点。GNU Bourne-Again shell 自动映射了用于编辑和命令回显的方向键。

GNU Bourne-Again 提示符包括:

  • 命令完整路径:/bin/bash
  • 非 root 用户默认提示符:bash-x.xx$
  • root 用户默认提示符:bash-x.xx#

Shell 脚本的作用

这个类比略显简化,但可以把 shell 脚本想象成程序员的“自动填充”。与其逐条在键盘上输入命令,不如把一系列命令写成单个脚本,用户只需在命令行中输入一个简单的文件名即可触发。Shell 脚本可以执行程序运行、文本处理和文件操作。

Shell 脚本可以完成多种任务,包括监控(如磁盘使用情况)、执行备份、创建命令行工具、操作文件、运行程序、将程序链接在一起、完成批处理等。

Shell 的主要替代方案

在 IBM 的 VM 操作系统中,它们被称为 EXEC;在 DOS 中,shell 脚本被称为批处理文件。这些仍然是 shell 脚本。其他脚本语言,如 Javascript、Python、Perl 和 TCL,也都是脚本语言。不出所料,计算机专业人士各有所爱;我们稍后会谈到 shell 的优缺点。

为什么 Shell 如此流行?

Shell 在几乎所有操作系统上都很常见,因为它高效且易于更新。它可以监控您的计算机系统并执行常规备份,而无需您操心。

无需切换语法,因为 shell 的语法和命令与在命令行中输入的完全一致。此外,编写 shell 脚本简单且快速:启动快,调试也方便。

Shell 脚本有哪些缺点?

Shell 脚本容易出错,一旦出现问题也不易诊断。Shell 并非为复杂或大型任务设计,执行速度较慢。此外,Shell 在数据结构方面支持有限,还可能存在语法或设计缺陷。

Shell 是何时创建的?

第一份 shell 脚本由 MIT 的计算机工作人员 Louis Pouzin 于 20 世纪 60 年代初创建。他的第一个命令行是 RUNCOM,它让计算机科学家从编译、更新、重命名和移动等重复性任务中解放出来。

Pouzin 并非计算机语言专家,或许正因如此,他认为命令行本身就可以成为一种语言。

到 60 年代中期,Pouzin 与英国科学家 Christopher Strachey 合作。Strachey 设计了一个宏生成器,作为 Pouzin 命令语言的基础,运行在当时最先进的 Multics 操作系统之上。

Shell 名称的由来

Pouzin 将他的新语言命名为 “shell”,因为它是操作系统的最外层。

Shell 特性

Shell 之所以受程序员欢迎,是因为它简洁。但这并不意味着它很“基础”。Shell 提供了多项特性,包括:

后台处理

Shell 脚本的一大优势在于它能在后台运行。根据命令不同,Shell 可以在前台或后台执行。前台进程显示在屏幕上,只能按顺序运行。

后台进程不会显示在屏幕上,可以非顺序运行。要在后台运行 shell 脚本,用户只需在脚本末尾添加一个和号(&)。

通配符替换

通配符替换允许系统一次处理多个命令,或从文本文件中查找短语片段。例如,* 告诉系统匹配任意字符串,甚至是空字符串;? 匹配单个字符;[example] 匹配任一字符(“example” 仅为示例);[1-9](另一个示例)指示 shell 匹配某个范围内的字符。

命令别名

Shell 别名是命令快捷方式。有的别名是一个词,有的是单个字母。要查看别名列表,用户只需输入 ·alias。

命令历史

Shell 有许多节省时间和精力的方式,其中一个特别方便的功能是命令历史。无需重新输入命令,history 命令会显示该会话期间使用过的所有命令。

文件名替换

文件名替换也称为 “globbing”。当一个词包含 ?、* 或 [ 等字符,或者以 ~ 开头时,Shell 会将其视为模式,并用按字母顺序排列、与该模式匹配的文件名列表来替换。

输入/输出重定向

输入/输出(i/o)重定向允许用户将标准输入(stdin)和标准输出(stdout)与显示屏、键盘或文件进行互换关联。

管道

Shell 管道是另一种重定向方式,可将某个命令/进程/程序的输出发送到另一个命令/进程/程序。这使各命令/进程/程序能够同时运行,并实现连续的数据传输,而无需经过显示屏或临时文本文件。

Shell 变量替换

当 Shell 遇到包含特殊字符的表达式时,它会将代码转换为更易于用户识别的形式。这个过程称为变量替换,或简称变量。

变量也常被有经验的程序员使用。例如,如果程序员在执行程序前并不知道实际数值,他们可以用变量作为占位符,待代码准备好执行时再替换。

Shell 的差异

主要有两类 Shell:“sh” 和 “bash”。二者都在 Unix 操作系统中运行。Shell 是对任意 shell 中脚本编写的通称。顾名思义,bash(Bourne Again Shell)是在 shell 基础上的改进与扩展。

Bash 通过升级提供了更多功能,支持作业控制,更易于使用,并支持命令历史。Sh 不支持命令历史;其脚本可在任意 shell 中运行,且可移植性更强。

Shell 多年来如何演进

多年来,Shell 在演进的同时也基本保持了核心不变。Bourne shell 相比最初的 Thompson shell 是一大进步,但许多最初的功能仍被保留。当然,计算机和我们的期望都发生了变化。

理论上,Shell 的种类可以和用户数量一样多;但从根本上讲,主要有两类 shell——命令行或 Bourne。其他都算作变体,而非不同语言。

Unix shells

Unix shell 是最初的形态,并且至今仍然强大。Unix shell 适用于 Unix 及与 Unix 相关的操作系统,如 Mac。

命令行

命令行(csh)是最常见的 Unix shell。命令行在交互式工作方面表现出色,包括别名、cdpath、作业控制、路径哈希、目录栈等功能。它们还提供编辑与历史记录功能。

Tenex 命令行

Tenex 命令行(tcsh)由 Caregia Melo University 的 Ken Greer 开发。Tenex 被认为是对原始命令行版本的改进。与最初的 C 不同,Tenex 提供命令行编辑与补全等功能。1981 年,tsch 与 csh 合并。

Korn shells

Korn shells(ksh)是另一种 Unix shell,可以看作是 C 与 Bourne 的折中方案,并与后者向后兼容。Korn shell 由 David Korn 于 20 世纪 80 年代初在贝尔实验室开发。

Bourne again shells

Bourne Again shell(Bash)是一种开源的 Unix shell,由 Brian Fox 在 20 世纪 90 年代后期为 GNU 项目编写,作为对 Bourne shell 的升级。

奇特的 Shell

尽管它们都构建在 C 或 Bourne shell 之上,程序员已经设计了数百甚至上千种不同的变体。有些很实用,有些则纯属娱乐。

谁在使用 Shell?

几乎所有计算机用户都能从 shell 中受益,但它对系统管理员、DevOps 人员、程序员和数据科学家尤其有用。Shell 被用于自动化任务与应用、安装软件包、备份或恢复数据,当然也用于编程。

Shell 示例

Shell 的复杂程度取决于用户的需求。一个简单的 bash 问候示例如 echo “hello $USER”,而复杂的 shell 脚本几乎没有上限。以下是一些基础示例:

示例 1:在 bash 中使用 while 循环

使用合适的编辑器在 bash 中创建一个文件。这里我们使用 vi 编辑器。
 
$ vi example.sh
 
这会打开一个名为 example.sh 的文件的编辑器窗口。
按下 “i” 键开始插入代码:
#!/bin/bash
valid=true
count=1
while [ $valid ]
do
echo $count
if [ $count -eq 10 ];
then
break
fi
((count++))
done
按下 Esc,然后输入 “:wq” 保存并返回终端。
通过执行 bash example.sh  来运行
示例 2:从终端接收用户输入
 
在 vi 编辑器中创建另一个文件:
$vi example2.sh
 
在编辑器中输入以下代码:
#!/bin/bash
echo "Enter first number"
read x
echo "Enter second number"
read y
((sum=x+y))
echo "The result of addition = $sum"
通过执行 bash example2.sh 来运行
 
要了解更多对数据科学有用的 shell 命令,请查看这篇关于实用 Shell 命令的教程。

与 Shell 相关的职业

与其说是职业路径,不如把 shell 脚本看作数据科学家工具库中的一件利器。各类数据从业者都需要掌握多种语言(或至少应该如此),而 shell 脚本有助于他们更高效地使用这些语言。

尽管如此,一些公司确实有明确要求掌握 shell 脚本的岗位。平均薪资约为 78,000 美元。此外,shell 脚本也是诸如系统管理员等岗位的基石,而这些岗位的薪资可达六位数。

总结

Shell 就像贯穿各类编程语言的一根线。复杂命令被提炼为简洁且直观的速记。理解 shell 对任何数据科学家或计算机工程师而言都是一项重要技能。欢迎在 DataCamp 的Shell 入门课程中进一步学习。

Shell 常见问答

什么是内核?

内核是操作系统中最核心的部分。内核负责为计算机程序分配内存与时间,并在响应系统调用时管理通信与文件存储。

什么是 shell?

Shell 是内核与用户之间的接口。

使用 shell 有哪些好处?

我们已经知道 shell 很高效,能替您处理许多枯燥的任务;除此之外,shell 还允许用户自定义脚本以满足自身需求。

shell 有哪些缺点?

一个小小的错误就可能代价高昂且难以定位。此外,shell 在不同操作系统之间的可移植性并不强。

Unix 与 Linux 有何区别?

Linux 是 Linus Torvalds 开发的一个 Unix 克隆。Linux 本身并不是操作系统;它是一个内核。而 Unix 则包括内核、shell 和各种程序。

Linux 与 Unix 系统上常用的 shell 有哪些?

Bash(Bourne Again shell)是最常用的 shell,但 Linux 与 Unix 也都支持命令行、KornShell 和 TCSH。

什么是 shell 语法?

在自然语言中,语法指单词与短语的组织方式。Shell 语法也类似,指的是操作的先后顺序。

什么是解释器?

解释器将单条语句解释为机器码。

什么是编译器?

编译器将高级程序翻译为更底层的机器语言。

如何执行一个 shell 文件?

通过以下方式设置权限:chmod+x script-name-here.sh

然后使用以下方式运行:./script-name-here.sh 或 sh script-name-here.sh.

主题