Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Shell 之初识(一) #39

Open
toFrankie opened this issue Feb 25, 2023 · 0 comments
Open

Shell 之初识(一) #39

toFrankie opened this issue Feb 25, 2023 · 0 comments
Labels
2022 2022 年撰写 Linux 与 Linux 相关的文章 Shell 与 Shell、Bash、Zsh、Sh 等相关的文章

Comments

@toFrankie
Copy link
Owner

toFrankie commented Feb 25, 2023

配图源自 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 是参数,是可选的。参数通常分为命令配置项和用户输入两种:

  • 配置项参数:一般以连字符 --- 开头,通常有长、短两种形式,比如 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 键能玩出各种花样,成倍地提高输入效率。

@toFrankie toFrankie added Linux 与 Linux 相关的文章 Shell 与 Shell、Bash、Zsh、Sh 等相关的文章 labels Feb 25, 2023
@toFrankie toFrankie added the 2022 2022 年撰写 label Apr 26, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
2022 2022 年撰写 Linux 与 Linux 相关的文章 Shell 与 Shell、Bash、Zsh、Sh 等相关的文章
Projects
None yet
Development

No branches or pull requests

1 participant