Shell 之初识

发布于 2023-05-11 21:53:14 字数 4302 浏览 51 评论 0

配图源自 Freepik

一、简述

在计算机科学中,Shell 英文原意是「外壳」,用来区别于 Kernel,即「内核」。

它是用户与内核之间的一座桥梁,简化操作的同时,又能保证内核的安全。从这个层面看,Shell 是一个「应用程序」,一个功能强大、系统级别的超级应用。Shell 提供了很多方便、实用的工具来降低用户操作成本,例如 cptouchmkdir 等内置命令。

历史上,出现了很多种 Shell 应用,其实现、功能以及使用方式大部分相同,但又稍有区别。比如 Boush Shell(sh)、Bourne Again shell(bash)、Z Shell(zsh)等。从这个层面来看,Shell 是一个「解析器」。当用户在命令行环境输入操作指令后,由 Shell 解析器进行解析,然后再传递给操作系统,接着转换为内核可识别的指令操作,进而控制硬件,以到达用户操作计算机的目的。主流操作系统中,内置了很多种 Shell 解析器,最常见的有 bash、zsh 等。

提供了 Shell 的命令行环境的应用,被称为「终端」,即 Terminal。

不仅如此,Shell 同时又是一种「编程语言」。作为命令语言,它交互式解释和执行用户输入的命令,或者自动地解析和执行预先设定好的一连串的命令。作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支等。

所以,Shell 既是一个超级应用,也是一种用户输入的解析器,又能作为一门编程语言。本文将 Shell 视为一门编程语言去介绍。

二、简单使用

Shell 命令执行很简单,只要有一个终端工具即可,而且主流操作系统都会内置。例如 Windows 的 CMD、PowerShell,Unix-like 的 Terminal 等。简单地像 JavaScript 一样,只要有一个浏览器就能运行你所编写的代码。例如:

$ echo 'Hello Shell'
Hello Shell

$ echo $TERM_PROGRAM
Apple_Terminal

是不是很简单!没错,你已经入门了,哈哈!

注意,以上 $ 只是一个「命令行提示符」,一种行文习惯,表示其后的是一个 Shell 命令,常用美元符号 $ 表示。在命令行环境中,不需要输入它。

由于我是写前端的,这里用 JavaScript 类比一下。以上示例,echo 是 Shell 内置函数,将用户输入转换为标准输出(STDOUT),类似于 JavaScript 中的 console.log() 函数。而 TERM_PROGRAM 则是 Shell 内置的一个全局变量,类似于 JavaScript 的 windowObject 等内置变量(对象),只不过在 Shell 中引用变量,需要在变量名之前加上 $,仅此而已。

2.1 命令格式

形式如下:

$ command [ arg1 arg2 ... [ argN ] ]

其中 command 是具体的一个命令或可执行文件,arg1 arg2 ... argN 是传递给命令的参数,它们都是可选的。在 Shell 里,命令与参数、参数与参数之间用一个「空格」(或 Tab 键)区分。多余空格会被忽略,作用相当于一个空格。

$ ls -l

以上示例,ls 是命令,-l 是参数,是可选的。参数通常分为命令配置项和用户输入两种:

  • 配置项参数:一般以连字符 --- 开头,通常有长、短两种形式,比如 list 命令中的 -l--list,二者作用完全一致。短形式便于输入,长形式便于理解,仅此而已。
  • 用户输入参数:除配置项之外的参数,比如 git push origin main 中的 originmain 参数,这类参数往往是每个用户传参差异大,因此无法做成配置项。

2.2 多行命令表示

在命令行环境中,单个命令通常是一行表示,当命令输入完成后,按下「Enter」键,随即执行该命令,并输出结果。

太离谱了,Shell 竟然不给我换行输入的机会,哼!

其实不是的,Shell 是有提供这种输入的。假设命令很长,或者出于阅读性的考虑,我们是需要将命令写成多行的。可以在当前行末尾键入反斜杠 \,再按下「Enter」键即可换行输入了:

# 相当于 echo foo bar
$ echo foo \
bar

# 相当于 echo foobar
$ echo foo\
bar

请注意,反斜杠后的回车并不会占用形成一个「空格」效果,因此实际中需注意参数问题。

2.3 命令结束符与组合符

通常,一行输入多是单条命令。若要一行中执行多条命令,也是可以的。

命令结束符「分号」:

$ command1; command2

以上示例,先执行 command1 命令,待其执行完成之后,才接着执行 command2 命令。而且,无论第一个命令是否执行成功,第二个命令总会执行。

命令组合符 &&||

$ command1 && command2

$ command1 || command2

以上示例,其实跟其他高级语言类似,所以看到就能猜出个大概。

  • && 表示只有 command1 执行成功,才会继续执行 command2
  • || 表示如果 command1 执行失败,才会继续执行 command2

管道符 |

$ command1 | command2

# 相当于
$ command1 > tempfile
$ command2 < tempfile
$ rm tempfile

以上示例,前一个命令的输出,作为第二个命令的输入。这种方式对命令的简化非常有用。

以上提到的几种命令组合方式,命令都是「继发」执行的,并不是「并行」执行的。

三、常用快捷键

在终端工具中,提供了很多快捷键,可以简化操作。常用的有:

  • Ctrl + L:清除屏幕并将当前行移到页面顶部,作用同 clear 命令。
  • Ctrl + C:中止当前正在执行的命令,有些情况下需要按下多次。
  • Ctrl + A:将光标移至行首。
  • Ctrl + E:将光标移至行尾。
  • 方向键上:向后浏览命令执行历史记录。
  • 方向键下:向前浏览命令执行历史记录。

注意,不同操作系统下,部分快捷键组合方式会有所差异。主要差异体现在 Windows 下的 Ctrl 与 macOS 下的 Ctrl 键吧。

论快捷键的话,不得不提的是 Tab 键,可自动补全命令。如果再结合类似 zsh 等强大的 Shell 解析器,那么 Tab 键能玩出各种花样,成倍地提高输入效率。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

叹倦

暂无简介

0 文章
0 评论
21 人气
更多

推荐作者

亽野灬性zι浪

文章 0 评论 0

少年亿悲伤

文章 0 评论 0

南七夏

文章 0 评论 0

qq_EJoXxu

文章 0 评论 0

17780639550

文章 0 评论 0

萌逼全场

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文