蚊章汇 - Bipin Patwardhan
type: channel
link: https://linuxcn.bwsl.wang/author/1765/
description: Bipin Patwardhan
items: 探索 Shell 脚本的威力

探索 Shell 脚本的威力
type: item
date: 2023-07-31T15:10:32+08:00
description: 本文章向你介绍了 Shell 脚本的基础知识以及其在日常生活中的重要性。当我们登录到一个 UNIX/Linux 系统时，我们首先注意到的是闪烁的光标和 $ 符号之间的空格。这就是 Shell（交互界面）。多年来，它一直是一种无处不在（有时甚至是唯一的）与计算机交互的界面。在图形用户界面（GUI）出现和流行之前，终端和 Shell 是唯一的机制，可以让计算机按照我们的意图进行操作。乍一看，我们可能会想知道 Shell 的作用，除了将命令传递给底层操作系统以进行执行之外。我们中的大多数人熟悉像 ls（用于列出目录内容），cd（用于更改当前目录）等命令。通过 Shell，我们可以执行这些命令。Shell 理解我们输入的文本 - 将其转换为标记 - 然后在操作系统上执行这些标记。不同的 Shell 变种最初，终端使用了朴素的 Bourne Shell（即 Sh）。多年来，许多不同的 Shell 变种被开发出来和使用。其中一些流行的包括 C Shell（Csh） 和 Korn Shell（Ksh）。Sh 在一段时间内不再受欢迎，但通过其最新的化身 —— Bourne Again Shell（Bash），它再次流行起来。Shell 实际上是做什么的？Shell 是操作系统（OS）和用户之间的直接接口。通过使用命令和应用程序来使用计算机上安装的工具，我们可以使计算机按照我们的意愿工作。一些命令是安装在操作系统上的应用程序，而某些命令则是直接内置在 Shell 中的。在 Bash 中内置的一些命令包括 clear、cd、eval 和 exec，还有 ls 和 mkdir 这样的应用程序。内置在 Shell 中的命令因 Shell 而异。在本文中，我们将涵盖与 Bash 相关的几个方面。更多关于 Shell 的内容我们中的大多数人都用过像 ls、cd 和 mkdir 这样的命令。当我们在一个目录上运行 ls -l 命令时，该目录中的所有子目录和文件都会在屏幕上列出。如果数量很大，屏幕会滚动。如果终端不支持滚动条（在很多年里都是如此），则无法查看已滚动过的条目。为了克服这个问题，我们使用像 more 和 less 这样的命令。它们允许我们逐页查看输出。通常使用的命令是：ls -l | less 在这里 Shell 是在做什么？看起来像是单个命令，实际上是 ls 和 less 两个命令依次执行。管道符（|）将这两个程序连接起来，但连接由 Shell 管理。由于有了管道符，Shell 连接了这两个程序——它将 ls 命令的标准输出连接到 less 的标准输入（stdin）。管道功能使我们能够将任何程序的输出作为另一个程序的输入提供，而无需对程序进行任何更改。这是许多 UNIX/Linux 应用程序的理念——保持应用程序简单，然后将许多应用程序组合在一起以实现最终结果，而不是让一个程序做很多事情。如果需要，我们可以将 ls 的输出重定向到文件中，然后使用 vi 查看它。为此，我们使用以下命令：ls -l > /tmp/my_file.txt vi /tmp/my_file.txt 在这种情况下，ls 的输出被重定向到一个文件中。这由 Shell 进行管理，它理解 > 符号表示重定向。它将其后面的标记视为文件。使用 Shell 自动化结合命令的能力是使用 Shell 命令创建自动化脚本的关键要素之一。在我最近的项目中，我们使用集群模式执行 Python/Spark（PySpark）应用程序。每个应用程序执行了许多结构化查询语言（SQL）语句 - SparkSQL。为了跟踪应用程序的进展，我们会打印有关正在执行的 SQL 的详细信息。这样可以让我们保留应用程序中正在发生的情况的日志。由于应用程序在集群模式下执行，要查看日志，我们必须使用以下 yarn 命令：yarn log –applicationId [application_id] 在大多数情况下，应用程序生成的日志非常大。因此，我们通常将日志导入到 less 中，或将其重定向到一个文件中。我们使用的命令是：yarn log –aplicationId [application_id] | less 我们的开发团队有 40 人。每个人都必须记住这个命令。为了简化操作，我将这个命令转换成了一个 Bash 脚本。为此，我创建了一个以 .sh 为扩展名的文件。在 UNIX 和 Linux 系统上，文件扩展名并不重要。只要文件是可执行的，它就能工作。扩展名在 MS Windows 上有意义。需要记住的重要事项Shell 是一个解释器。这意味着它会逐行读取程序并执行它。这种方法的限制在于错误（如果有）在事先无法被识别。直到解释器读取和执行它们时，错误才会被识别出来。简而言之，假如我们有一个在前 20 行完美执行…