什么是 Bash?

bash logo on green background

Opensource.com

当计算机启动时,内核(无论是 Linux、BSD、Mach 还是 NT)会识别所有物理硬件,并使每个组件能够相互通信,并通过一些基本软件进行协调。计算机最基本的一组指令只是使其保持通电和安全状态:定期启动风扇以防止过热,使用子系统来监控磁盘空间或“监听”新连接的设备等等。如果计算机只能做到这些,那它们就会像对流烤箱一样无趣。

计算机科学家很早就意识到了这一点,因此他们开发了一个 shell,用于 Unix 计算机,它在内核之外(或围绕内核,就像自然界中的 shell 一样)运行,并允许人类随时与计算机交互。在人们将穿孔卡片送入计算机以告诉它们做什么的时代,这是一个令人兴奋的进步。在所有可用的 shell 中,Bash 是最受欢迎、最强大和最友好的 shell 之一。

Bash 是一个应用程序

当您启动一个终端(例如 Linux 上的 GNOME 终端Konsole,或 macOS 上的 iTerm2)运行 Bash shell 时,您会看到一个提示符。提示符是一个符号,通常是美元符号 ($),表示 shell 正在等待您的输入。当然,知道您应该输入什么完全是另一回事。

这可能看起来很不友好,但它实际上是对围绕术语“Bash”的许多含义的完美简洁的表示。对于许多新用户来说,Bash 的概念与 Linux 或 Unix 的概念之间没有区别:它就是传说中的黑屏绿字,您应该在其中编写代码来指示计算机下一步做什么。这会将 Bash shell 与您在 shell 中键入的命令混淆。重要的是要理解它们是两个独立的事物:Bash 只是一个应用程序,其主要工作是运行安装在同一系统上的其他应用程序(以命令的形式)。

[下载我们的免费 Bash 速查表]

您可以学习 Bash,但只能在学习其运行所在的操作系统的情况下学习。如果不了解命令,您就无法使用 Bash 做太多事情。

Linux 命令

在 Linux 和 Unix(例如 BSD 和 macOS)上,大多数命令默认存储在 /usr/bin/bin 等系统目录中。本质上,Bash 不知道这些命令,就像您自然不知道克林贡语一样,但正如您可以查找克林贡语单词一样,Bash 也可以查找命令。当您向 Bash 发出命令时,它会在您系统上的特定目录中搜索以查看是否存在这样的命令。如果该命令确实存在,则 Bash 会执行它。

Bash 也是一个命令,它通常是您打开终端窗口或登录文本控制台时执行的默认命令。要查找系统上任何命令的位置,包括 Bash,您可以使用终端中的 which 命令

$ which bash
/usr/bin/bash
$ which ls
/usr/bin/ls

一些命令内置于 Bash 中。大多数内置命令特定于 Bash 脚本或底层环境设置,但少数命令是普遍有用的,例如 cd(用于更改目录)。当您搜索内置命令时,它们不会显示出来,因为它们不存在于您通常的可执行路径中

$ which bash
which: no cd in (/usr/local/bin:/usr/bin:/bin:
[...]

但是,它们仍然可用,因为它们内置于 Bash 中,而 Bash 是您正在运行的程序。

运行 Bash

大多数现代 Linux 和 Unix 发行版默认提供 Bash shell。他们这样做是因为 Bash 是众所周知的,并且它具有其他 shell 所没有的几个便利功能。但是,某些系统默认使用另一个 shell。要确定您是否正在运行 Bash shell,您可以使用 echo 命令以及表示当前运行进程名称的特殊变量

$ echo $0
bash

如果您没有运行 Bash,但想尝试一下,您可能可以从您的软件中心、软件仓库或端口树下载并安装 Bash。或者您可以使用 Windows 上的 Chocolatey 或 macOS 上的 Homebrew。如果一切都失败了,请访问 Bash 官方网站以获取更多信息。

在 Bash 中工作

Bash 是您计算机的合法接口,它不仅仅适用于服务器管理员和程序员。它可以是您的桌面、您的文字处理器、您的图形编辑应用程序等等。有些人使用 Bash 比使用桌面应用程序更多。

Linux 和 Unix 有数百个可用的命令,您可能会惊讶于它们的多样性。例如,您可以调整照片大小和裁剪照片,而无需在查看器或编辑器中打开照片

$ mogrify -geometry 1600^x800 \
  -gravity Center \
  -crop 1600x800+0+0 myphoto.jpg

您可以使用 ogg123mpg321 等命令播放音乐,使用 sox 转换音频,使用 ffmpeg 调整和编辑视频,使用 emacsvim 编辑文本,使用 pinemutt 检查电子邮件,使用 elinks 浏览互联网,使用 rangermidnightcommander 浏览文件,以及做更多更多的事情。所有这些都在 Bash 中完成,使用您在系统或软件仓库中找到的命令。

Bash 脚本

Bash(以及一般的 Linux)被认为如此强大的一个原因是它可以编写脚本。任何您可以手动键入 Bash 的内容,您也可以将其列在一个纯文本文件中,并让 Bash 为您运行它。与其花一个下午手动运行数百个命令,不如编写脚本命令,让您的计算机在您处理更重要的事情时执行它们。由于 Linux 上的几乎所有内容都运行在 Bash shell 之上,因此 Linux 上的几乎所有内容都可以通过 Bash 编写脚本。虽然也有例外情况(例如,图形应用程序可能有自己的脚本语言,或者根本没有脚本),但对您的操作系统进行脚本编写可以打开数万个可能的功能,您可以在计算机上实现这些功能,而无需自己动手。

这每天为 Linux 用户节省的工作量是无法估量的。但这并不是通常的自动化带来的改变;而是人们为自己发明的定制工作流程,那些其他人认为不需要自动化的事情。

当有经验的用户说他们想学习 Bash 时,如果他们不是指他们想学习 Linux 命令,那么他们可能指的是他们想改进编写命令脚本的方式。例如,这是一个非常基本的 Bash 脚本,它将临时文件(想象一下它是由单独的进程创建的文件)转换为特定目录

#!/usr/bin/bash

cp tmp.png ~/public_html/`date +%Y%m%d`.png

那是有效的 Bash。您可以通过复制和粘贴命令(以 cp 开头的最后一行)到终端来验证它。只要有一个名为 tmp.png 的文件和一个名为 ~/public_html 的目录,该命令就可以工作。

但是,学习 Bash 的全部意义在于理解如何为了自动化而改进像这样的简单命令。例如,如果文件 tmp.png 不存在,则脚本将失败。如果此脚本是关键组件,例如,一个博客网站每天都需要一张新图片,以便可以构建自定义标题图片,那么脚本的失败可能会在其他地方导致灾难性错误。了解 Bash 的用户可以使用 Bash 语法添加弹性

#!/usr/bin/bash

IMG="tmp.png"

[[ -e tmp.png ]] || IMG="generic.png"

cp ~/"${IMG}" ~/public_html/`date +%Y%m%d`.png

这只是学习使用 Bash 编写脚本的过程的一个示例,但它演示了学习 Linux 和 Bash 如何同样有用,并且并非完全独立的任务。

Bash 的优势

Bash 与其他 shell 一样强大,但添加了便利功能,例如示例代码中的双括号 ([[]])。这些“Bashism”深受 Bash 用户喜爱,因为它们避免了 tcsh 或 ash 等其他 shell 中有时冗长而笨拙的语法。但是,它们是 Bash 特有的,并且不符合 POSIX 标准,这可能会在未运行 Bash 的系统上导致兼容性问题。话又说回来,Bash 是开源 自由软件,因此大多数用户可以在需要时安装它。缺乏兼容性只会强制增加额外的依赖项,而不会阻止任何人使用脚本。

学习 Bash

如果您想学习 Bash,您可以阅读许多关于该主题优秀书籍

或者,您可以参加 EdX.org 上的在线课程,甚至参加一些免费的红帽课程

最棒的是,您还可以玩游戏来学习 Bash。

祝您好运,祝您快乐地进行黑客活动!

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.