Shell 之初识
一、简述
在计算机科学中,Shell 英文原意是「外壳」,用来区别于 Kernel,即「内核」。
它是用户与内核之间的一座桥梁,简化操作的同时,又能保证内核的安全。从这个层面看,Shell 是一个「应用程序」,一个功能强大、系统级别的超级应用。Shell 提供了很多方便、实用的工具来降低用户操作成本,例如 cp
、touch
、mkdir
等内置命令。
历史上,出现了很多种 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 的 window
、Object
等内置变量(对象),只不过在 Shell 中引用变量,需要在变量名之前加上 $
,仅此而已。
2.1 命令格式
形式如下:
$ command [ arg1 arg2 ... [ argN ] ]
其中 command
是具体的一个命令或可执行文件,arg1 arg2 ... argN
是传递给命令的参数,它们都是可选的。在 Shell 里,命令与参数、参数与参数之间用一个「空格」(或 Tab 键)区分。多余空格会被忽略,作用相当于一个空格。
$ ls -l
以上示例,ls
是命令,-l
是参数,是可选的。参数通常分为命令配置项和用户输入两种:
- 配置项参数:一般以连字符
-
或--
开头,通常有长、短两种形式,比如list
命令中的-l
和--list
,二者作用完全一致。短形式便于输入,长形式便于理解,仅此而已。 - 用户输入参数:除配置项之外的参数,比如
git push origin main
中的origin
、main
参数,这类参数往往是每个用户传参差异大,因此无法做成配置项。
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 技术交流群。
上一篇: Shell 之变量
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论