我希望拥有的 Shell 简介
嘿,过去的我。希望你一切顺利,尽量减少那些可怕的遗憾。在这方面,我会帮你。至少是那些与职业相关的遗憾。对于那次在 OkCupid 上被推土机撞到的约会,我无能为力……其实,那是下次再说吧。
所以我写信给你,过去的我,编程的自己,是为了让你快速了解一个重要的东西:Shell。未来的我(相对而言)更睿智,并且愿意提供帮助。我之前写过一篇类似的 Git Rebasing 指南,你(和其他人)都觉得很有帮助。这次我的文章内容更广泛,为学习和理解 Shell 及其重要性奠定了基础。
Shell 是什么?
要真正理解 Shell 及其用途,你需要了解一些计算机科学背景知识。不用担心,其实并不多。
你使用 Mac,因为你拥有灵魂。你的 Mac 操作系统 (OS) 建立在 Unix 之上,这是一个流行的开源操作系统。Unix 的理念是模块化——程序应该简洁,并且只执行有限的、定义明确的功能。
计算机的Shell本质上是通过文本界面(通常称为“命令行”)直接访问操作系统功能的一种方式。可以这样理解:您通常通过双击图标来浏览文件夹。这就是使用图形用户界面 (GUI),因为有视觉效果来引导您。
Shell 允许您执行所有常规操作,但只能使用文本命令 - 没有图标可供查看、单击或拖动。
Shell 为何有用?
我能猜到你在想什么,因为我和你一样。你会问:“为什么用纯文本界面来操作电脑会更好?听起来很难,而且不太实用!” 但对于程序员来说,它们有两个关键的好处。
- Shell 可以完成许多 GUI 无法做到的事情。想要在本地运行网站并查看基于变更的实时更新?为代码库安装所需的软件包?运行 Gulp 或 NPM 工作流程?在电脑上开发原型应用?所有这些操作都需要 Shell。有些功能确实有 GUI 版本控制 - 例如,您可以通过 Shell 或 SourceTree 等应用程序使用 Git 源代码管理。但这些 GUI 永远无法提供您所需的全部功能。还记得 git rebasing 吗?在任何 GUI 上执行它都困难得多,甚至不可能。
- Shell 可以让你自动化原本耗时的任务。作为一名程序员,你会有很多重复的计算机任务,这会浪费你的时间和效率。Shell 可以让你将复杂的任务压缩成简单的命令来完成所有工作。
可见学习 Shell 对你的未来有多重要。说实话,学习过程确实有难度。但如果你不克服它,你的职业生涯就很难走远。
不同类型的贝壳
几乎所有计算机都有 Shell,而且 Shell 的种类也不同。你应该熟悉一下 Bash,因为它很可能是你的默认 Shell。之后同事会帮你设置 ZSH,不过那是以后的事了。一开始先专注于 Bash,本文的其余部分我会参考它。
Shell 操作
这部分需要耐心。很多时候,你会查看 Shell,发现所有基本命令都太过平凡,然后就放弃了学习。我们稍后再讲解最精彩的部分。现在,我们可以说是在“啃 Shell 的蔬菜”。
Shell 的操作有很多,篇幅已经够长了。不过我会分解最重要的几个基本操作,足够让你了解 Shell 的强大功能,并让你自己学习更精妙的细节。
你的第一个命令
你的 Mac 上应该有一个名为“终端”的应用程序,它可以运行 Shell。打开它,你会看到 Shell 以简单的文本提示符的形式出现。你可以在这里输入 Shell 命令。
一个好的启动命令是ls
。它会显示当前目录或您所在计算机文件夹中的所有文件。如果您位于一个充满文本文件的文件夹中,您将看到每个文件的名称。
大多数命令也接受标志,这些标志会稍微改变其功能。它们的使用方法是-
在命令中添加一个与字符配对的 。例如,使用ls
和 标志的组合可能如下所示ls -1
。此命令还会显示目录中的所有项目,但会显示在不同行中。
想查看所有标志?运行 ,使用 来man
查看命令。你将看到所有你需要了解的 信息,包括它的功能以及所有标志!这也许是最重要的命令,因为它提供了所有命令的有用信息。经常使用它!ls
man ls
ls
一些基本命令
ls
这只是众多实用的基本命令之一。这里还有一些命令,我只会提供基本的概述。用 来检查它们man
,运行几次,看看会发生什么!实验是学习的最佳方式。
pwd
- 查看当前目录cd
- 导航到不同的目录cd ~
- 转到你的根目录mkdir
- 创建新目录touch
- 创建新文件cat
- 显示文件的内容cp
- 复制文件rm
- 删除文件或目录wc
- 获取单词数、字符数或行数echo
- 显示文本或其他命令的编译文本。非常适合测试命令。
还有一些稍微高级一点的,你应该花时间去学习。
- Curl - 从服务器下载或传输数据。安装新东西时你会经常看到它!
- Grep - 根据不同的模式或正则表达式(又称 regex)逐行过滤结果
- 管道 (|) - 获取一个命令的输出并将其用作另一个命令的输入
- Awk - 让您以不同的方式处理文本文件
- Sed——使用正则表达式操作文件中的文本
如果您需要更具体的指南,请查看“学习足够的命令行以应对危险”。
还有不同的包含模式、正则表达式、带括号的数字输出模式等等。你现在不需要全部了解。记住这些新知识,以后再学习。
不过,我在这里还有最后一件事要提……
了解变量
Shell 变量与其他编码语言类似:它们是存储在其他地方以供引用的值。
声明一个使用[VAR]=[value]
语法,名称通常全部大写。一个基本示例是 CUPCAKES=5。
检查变量的值也很简单。在这里,你只需运行echo $CUPCAKES
,就能得到5
。记住变量名上的美元符号!
另一个重要提示:关闭终端后,您在会话中写入的所有变量都会消失。为了充分利用变量,您需要保存它们。为此,我们需要点文件,我稍后会解释。
在此之前,完成这些基本操作后,让我们来介绍一下 Shell 最重要的用途——包管理器
包管理器
关于 Shell 的实用性,我首先要说的是它能做到大多数 GUI 无法做到的事情。这大部分都归功于包管理器。
好的,那么什么是包管理器?
举个例子:在你职业生涯的早期,你曾使用 Gulp.js 来处理诸如将 Sass 转换为 CSS 之类的操作。你会使用 Shell 导航到该目录并运行类似gulp
或 的命令gulp styles
来启动它。你并不真正了解自己在做什么,也不知道它是如何工作的,但你成功了。其他命令也是如此,例如npm start
、yarn develop
、ember server
和rails server
。
从本质上讲,这些都是已安装的 Shell 命令,并传入了参数。Shell 是您可以使用它们的全部原因。
yarn
但是,如果你可以使用像和 这样的命令npm
,那么创建它们的代码存储在哪里呢?它还没有安装在你的电脑里,所以它肯定是从某个地方来的,对吧?
你可以想办法下载、存储并正确访问这些代码库中的所有代码,以便它们在命令行中运行。这包括更新和导航所有代码、设置指令以及检查所有代码。正如你所料,这极其浪费且低效。
软件包管理器可以帮助避免所有这些问题。它们是下载、组织和更新运行这些重要命令所需的所有代码的便捷方式。
安装第一个包管理器
同事会向你介绍Brew,你绝对应该安装一下。它能让创建和运行不同类型的代码变得轻而易举。
例如,假设您想安装 Node.js 在服务器上运行 JavaScript,并使用 Express 等工具构建网站。当您第一次接触 Node 时,您看到一个令人困惑的下载页面,不知道该去哪里。您会下载所有文件,但不知道它们应该放在哪里、如何运行,或者它们在您的计算机环境中应该处于什么位置。您最终放弃了它,并且好几个星期都没有再尝试,还记得吗?使用 Brew,这一切本来可以轻而易举!
要安装 Brew,只需在 Shell 中运行以下命令:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
这个 Shell 命令看起来很复杂,但核心很简单。它用于curl
下载一个 ruby 脚本,并在你的电脑上运行它来安装 Brew。
安装需要一段时间,但现在你可以使用 Brew 快速安装 Node 之类的东西。就这么简单:
brew install node
Brew 下载 Node,设置它,让你更新它,并将其全部链接到node
命令。
对此的快速测试是使用以下代码创建 JavaScript 文件:
// test.js
var number = 1 + 4;
console.log(number);
然后导航到它所在的目录并运行以下命令:
node test.js
5 // Output
您将使用 Brew 添加其他重要组件,例如 nvm、Ruby、rvm、npm 等等。有了对 Shell 的基本了解,您将了解其基本工作原理以及如何充分利用它。因为最终,许多复杂的编程工作都只是 Shell 命令而已。
总而言之,包管理器是处理 Shell 中最重要的事情的最佳方式。你至少应该花这么多时间学习 Shell,因为如果你想成为 Shell 专家,这件事不能拖延。
点文件
让我们回顾一下 Shell 的一些基本知识。点文件由 Shell 存储,通常包含用于配置 Shell 的持久变量。您还可以在其中保存命令。
点文件通常以.
开头(因此得名)。如果您以前只使用过 GUI,您可能从未见过。那是因为您只能通过 Shell 查看它们!运行ls -a
,您将列出常规文件和点文件。
使用 Bash,您可以运行cd ~
以进入根目录,然后ls -a
查看一些重要的 shell 文件。这些文件包括:
.bash_profile
- 基本配置文件.bashrc
- “启动”文件。此处的命令会在每个新的终端会话中自动运行。
你可以用该命令查看这些文件以及其他点文件cat
。但是如何编辑它们呢?那就用神奇的 VIM 吧!
VIM
Vim 本质上是一个文本编辑器。它内置于 Shell 中,你经常用它来编辑 Shell 特有的内容,例如点文件。然而,Vim 与你的第一个文本编辑器 Sublime Text 截然不同。
最大的问题是,由于VIM 是基于 Shell 的,它是一款只使用键盘的文本编辑器。还记得吗,Bash 没有 GUI 可以点击?这使得 VIM 对程序员来说非常高效,但学习起来难度很高。
您无需立即使用 VIM,也可以根据需要在其他编辑器中打开点文件。但是,如果您运行了类似的命令vim .bashrc
并希望安全退出 VIM,请执行以下操作:
- 打
esc
- 类型
:q
- 打
enter
在此之前,请运行 来避免使用 VIM open <name>
。它会改用你的默认文本编辑器打开文件。但 VIM 会不断弹出,所以至少要注意它。
别名
现在我们进入 Shell 的“省时自动化”部分!
别名本质上就是命令快捷键。您可以将长命令或连续命令保存为更短、更容易记住的命令。如果您经常运行某个长命令,可以将其保存为别名!
在 Bash 中,你可以为文件添加别名bash.rc
。每个别名占一行,如下所示:
alias <name>="<put shell commands here>"
以下是首先为 Bash 添加的两个有用的别名示例:
alias viewali="cat ~/.bashrc"
alias editali="open ~/.bashrc"
这里,viewali
运行命令导航到别名文件本身并显示其内容。editali
在文本编辑器中打开它,以便您可以添加或更改它们(稍后您将使用vim
)。现在,您可以通过 Shell 轻松查看和更新您的别名!
想要一个更实用的例子吗?快进到我的时代,当你用 Gatsby.js 搭建个人网站时,你会添加这个:
alias mysite="cd ~/Documents/gatsby-blog && code . && yarn develop"
抛开具体细节不谈,这个别名可以在 Visual Studio Code 中打开我的站点仓库,并在本地运行。这只是 Bash 潜力的冰山一角。
功能
假设你想自动化一些更复杂、需要传入参数的操作。这可以通过将函数保存到别名文件中来实现。这是一个非常简单的例子:
testfunction(){
echo $1
echo $2
}
每个以$
开头的变量都是一个参数。它们按照传入的顺序进行编号。$1
第一个参数是 ,$2
第二个参数是 ,依此类推。
// Running the function...
testfunction hello world
// Returns this!
hello
world
注意:您需要重新启动终端才能使新的别名和功能生效。
脚本
脚本文件类似于别名,因为它们保存 Bash 功能以供以后使用,但有几个区别:
- 它们以 .sh 扩展名结尾
- 该文件本质上是一个接受多个参数的巨型函数。
- 对于 Bash,它们通常保存在
usr/bin
目录中。它们可以随时从那里运行 - 脚本文件无法立即从 Shell 运行。您需要运行
chmod +x <filename>
才能使其可执行
脚本文件对于执行更复杂、更具体的操作非常有用,因为这些操作会占用别名文件的空间。一旦你熟练掌握 Shell 的使用方法,你就会接触(并编写)更多这样的脚本。
例如,当你与其他程序员协作时,运行所有持续集成测试的文件将是一个脚本文件。因此,了解 Shell 将有助于你改进该文件创建和运行这些测试的方式。
结论
从很多方面来说,Shell 是程序员赖以生存的必需品。它是程序员摆脱程序使用者的束缚,与程序开发者同场竞技的关键要素。《程序员修炼之道》(The Pragmatic Programmer)曾被誉为最佳编程书籍之一,书中将 Shell 称为程序员的“工作台”,并指出 Shell 能助你大幅提升工作效率。
您无需立即了解 Shell 的全部功能(本文只是极高层次的概述)。现在,您只需要了解它的功能即可。它如何帮助您提高效率。它在本地运行代码、管理工具、设置测试等方面发挥着关键作用。
程序员需要 Shell 来更好地完成工作。它不会消失。无论一开始你有多不舒服,深吸一口气,开始使用它吧。向未来的自己学习。从克服冒名顶替综合症到与同事良好合作,了解 Shell 总是有帮助的。
文章来源:https://dev.to/maxwell_dev/the-shell-introduction-i-wish-i-had-551k