Shell 之初识(一)

2022-08-21  本文已影响0人  越前君
配图源自 Freepik

下一篇:Shell 之变量

一、简述

在计算机科学中,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 是参数,是可选的。参数通常分为命令配置项和用户输入两种:

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 > tempfile
$ command2 < tempfile
$ rm tempfile

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

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

三、常用快捷键

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读