The Missing Semester of Your CS Education(计算机教育中缺失的一课)

Course overview + the shell(课程概览与shell)

本笔记均使用虚拟机Ubuntu(VMware)


一、The Shell

What is the shell?

如今的计算机有着多种多样的交互接口让我们可以进行指令的的输入,从炫酷的图像用户界面(GUI),语音输入甚至是 AR/VR 都已经无处不在。 这些交互接口可以覆盖 80% 的使用场景,但是它们也从根本上限制了您的操作方式——你不能点击一个不存在的按钮或者是用语音输入一个还没有被录入的指令。 为了充分利用计算机的能力,我们不得不回到最根本的方式,使用文字接口:Shell

几乎所有您能够接触到的平台都支持某种形式的 shell,有些甚至还提供了多种 shell 供您选择。虽然它们之间有些细节上的差异,但是其核心功能都是一样的:它允许你执行程序,输入并获取某种半结构化的输出。

我们会使用 Bourne Again SHell, 简称 “bash” 。 这是被最广泛使用的一种 shell,它的语法和其他的 shell 都是类似的。打开shell 提示符(您输入指令的地方),您首先需要打开 终端 。您的设备通常都已经内置了终端,或者您也可以安装一个,非常简单。打开终端terminal显示的窗口就是shell。

1.1、使用shell

这就是shell提示符, 这是 shell 最主要的文本接口。它告诉你,你的主机名是 ailichenghuan并且您当前的工作目录(”current working directory”)或者说您当前所在的位置是 ~ (表示 “home”)。 $ 符号表示您现在的身份不是 root 用户。在这个提示符中,您可以输入 命令 ,命令最终会被 shell 解析。

我们可以在此输入一些简单命令,如下:

"date"命令来显示日期和时间,"echo"则是可以打印出来我们给它的参数,参数就是命令后用空格来区分的东西。那么参数既然是由空格来分隔的,那么如果我想输出一个带有空格的多个单词组成的参数该怎么办?

上述图片介绍了两种方法:①"echo"命令后面要输出的字符串加上一个双引号即可。②可以在想要输出空格的地方前面加上转义字符"\",这样就可以正确输出我们想要的字符信息。

但是shell是如何知道这些程序的呢,并且是如何知道它该做什么的呢?

答案是,我们的计算机(虚拟机)会自带一些内置程序,它会自带一些面向终端的应用程序,这些程序存储在文件系统中。shell通过环境变量来搜索这些程序。环境变量是一种变量,类似于编程语言中的变量。

要查看我们的搜索路径,有一个至关重要的变量,即路径变量。

如果我们运行上述命令,就可以显示所有的路径列表,shell就是在这些路径中搜索程序的。

本质上,当我们每次键入命令程序时,它都会在计算机中搜索这个路径列表,并在每个目录中查找,与我们尝试运行的命令匹配的程序或文件的名称。因此,当我们尝试运行"date"和"echo"时,它将逐个遍历这些路径,直至找到名为"date"或"echo"的程序,然后运行。

如果我们想知道"echo"具体运行的是哪个程序,"which"命令可以帮助我们。

这时候我们不得不谈一谈路径路径是一种描述计算机上文件位置的方式。

在Linux和macOS上,这些路径是由斜杠(正斜杠"/")分隔的,而在Windows上是反斜杠"\"。

上图是在根目录下进行的操作,所以开头的斜杠代表从文件系统的顶部开始,然后依次查看名为"usr"、"bin"、"echo"的文件。

Linux和macOS上,所有内容均属于根目录下;在Windows上,每个分区都有一个根目录,例如:"C:\"或"D:\"的路径。

因此在Windows上,每个驱动器都有一个单独的路径结构。而Linux和macOS则被挂载在一个命名空间下。

绝对路径:能完全确定文件位置的路径。(如上述的例子"echo")

相对路径:相对于当前所在位置的路径。"pwd"可以帮我们打印当前所在路径。

于此,我们可以更改我们当前的工作目录,"cd"代表更改目录,这是更改当前工作目录的命令。

还有几个特殊目录,"."和"..":"."表示当前目录,".."表示父目录。

我们亦可以通过".."来退回到拥有/bin/echo的目录中去,并执行打印world。

"ls":帮助我们列出当前目录中的文件。

而对于"ls",我们也可以给它一个路径参数,然后它会列出相应路径下的文件,而不是当前所在目录的文件。

还有两个特殊的符号:①"~"将你带到主目录,所以"~"总是扩展到主目录,你可以利用其来写相对路径,"~"扩展到"/home/ailichenghuan"。

②"-"可以将你切换到之前所在的目录。

"ls --help"可以打印出关于此命令的帮助信息。

上图中,在我们使用ls命令时,可以指定选项[OPTION]...文件[FILE]...,"..."则表示零个,一个或多个选项;"[]"表示可选项。

通常,我们称单个破折号("-")和单个字母的组合为标志,不带任何值的内容也是标志(flag);带有值的称为选项(option)。例如,"-a"和"--all"都是标志;"-C"或"-color"是选项。

向下滚动,我们可以发现还有一个"-l",它是用来显示长列表格式。

它可以为我们提供更多的额外信息。

首先,我们看到第一列中以"d"开头的条目,表示其是一个目录(directory)。接下来的九个字符,每三个字符构成一组。其后的字母表示为该文件设置的权限,第一组的前三个字符是为文件的所有者设置的权限

这张图片可以看到,文件全是我所拥有的;第二组的三个字符是为拥有该文件的组设置的权限;最后一组的三个字符是其他人的权限列表。

(rwx):它们分别代表了文件所有者(missing),用户组(users) 以及其他所有人具有的权限。其中" - "表示该用户不具备相应的权限。从上面的图片来看,只有文件所有者可以修改(w),missing 文件夹(例如,添加或删除文件夹中的文件)。为了进入某个文件夹,用户需要具备该文件夹以及其父文件夹的“搜索”权限(以“可执行”:x)权限表示。为了列出它的包含的内容,用户必须对该文件夹具备读权限(r)。对于文件来说,权限的意义也是类似的。注意,/bin 目录下的程序在最后一组,即表示所有人的用户组中,均包含 x 权限,也就是说任何人都可以执行这些程序(例如:"echo"命令)。

"move/mv":重命名或移动文件,重命名或移动文件需要两个路径,旧路径和新路径。

"cp":复制文件。此命令也需要两个参数,一个是要复制的文件路径,一个是目标路径,这两个路径都要求是完整路径,它们不必在同一目录下。

"rm":删除文件,需要提供文件的路径。

注意:在Linux上,默认情况下,删除不会递归进行,所以我们不能使用"rm"来删除一个目录。

我们可以使用"-r"标志进行递归删除。

"rmdir":删除目录,但只能删除空目录。

"mkdir":创建一个新目录。

"man":想要知道更多命令如何在平台上工作的信息。命令用于手册页。这个程序以另一个程序的名称作为参数,并给出它的手册页。

"ctrl+l":键盘快捷方式,它可以清除终端并回到顶部。

"< >":"<" - 表示将这个程序的输入重定向为这个文件的内容;">" - 表示将前面程序的输出重定向到这个文件中。

当我们输入上述命令"echo hello > hello.txt"时,我们期望将hello输入到文件hello.txt中去,因为我们给出的是相对路径,那么程序的期望结果是:在该路径创建一个名为hello.txt的文件并且内容是hello。

我们使用"cat"命令来验证猜想,"cat":打印文件内容。该命令还支持将输入和输出连接到一起。

当我输入这条命令的时候,将会呈现什么结果?我们可以分析一下,"cat"默认情况下是将输入内容复制到输出中,我们告诉它从hello.txt中读取输入,此时,shell会打开hello.txt并读取其中内容,并将其设置为"cat"命令的输入。"cat"将其输出,但因为我并没有做输出重定向,故输出会显示在终端上。

如果我们想复制一个文件,但还不想使用"cp"命令,我们可以用"cat"实现。

在这种情况下,我们什么也没告诉"cat",只让其按照默认方式运行,"cat"也并不知道重定向操作,但是我让hello.txt作为"cat"命令的输入,并将"cat"命令打印的任何内容写入world.txt上。

">>":表示追加,而不是覆盖。

"|":管道符,将左边程序的输出作为右边程序的输入。

我们以"ls -l /"或"ls /"为例,如果我们只想输出其最后一行该怎么办呢?

我们可以使用命令"tail":这个命令可以打印输入的最后n行。使用"-n1"参数(或者"--line=1")。这里只表示打印最后一行。

接下来我们可以将两个命令连接到一起,

在刚才的演示里,我们的tail并没有重定向,所以它输出到了终端上,这次我们可以将其重定向:

1.2、root

"sudo"或"do as su":这里的"su"代表超级用户,这是以超级用户的身份执行操作的一种方式,通常,我们在终端中输入"sudo"+命令,我们就可以以root用户的身份运行该命令,而不是你实际使用的用户身份。

我们在什么情况下会使用此命令呢?当我们进入"/sys"文件时,我们可以发现这里的文件实际上不是我们计算机上的文件,而是各种内核参数。内核就像我们计算机的核心,我们可以通过文件来访问各种内核参数。

当我们进入"class/",里面有许多不同类型的设备可以与之交互,或者可以访问各种队列或各种内部奇怪的旋钮。

由于它们暴露为文件,所以我们可以使用到目前为止的所有工具来操作它们。

例如,我们直接进入"backlight/",这可以让我们直接配置笔记本电脑的背光灯(如果我们有它的话),很明显我这里是没有的!

假设我们有背光灯的话,我们可能会使用命令"echo 500 > brightness"去改变亮度,可是这个时候我们可能会看到权限被拒绝的提示,这时我们又考虑如果加上"sudo"呢?结果是同样被拒绝。这是为什么?因为我们输入或输出的重定向是不被程序所知道的,通道的重定向是由shell设置的,所以,在这种情况下,我告诉我的shell运行程序"sudo",并使用参数"echo"和"500",并将其输出发送到"brightness"文件中,但是打开文件"brightness"的是shell,而不是"sudo"程序。所以,作为我们自己运行的shell,尝试打开文件进行写入操作,是不被允许的。

"#":以root的身份运行此命令。"$":表示你不是以root身份运行。

为了解决此问题,我们可以切换到root终端,因此,可以通过运行"sudo su"来执行此操作。

"sudo su":表示以root身份运行以下命令,"su":是一个复杂的命令,它可以让你以超级用户身份获取一个shell。

这个时候我们在进行上述的尝试,则不会出现错误。

我们还可以用另一个方法:"echo 1060 | sudo tee brightness",这里我告诉终端运行"echo 1060",它会打印出1060;然后我会告诉它运行"sudo tee brightness",并让它将"echo"的输出发送到"sudo tee"中。"tee":会将输入内容写入一个文件,同时也将它输出到标准输出。让"sudo tee"作为root用户运行,并将输出写入"brightness"文件中。

"xdg-open":在Linux上,给出一个文件名,它将在适当的程序中打开它。例如我们想使用它打开一个HTML文件,它将打开我们的浏览器并打开此文件。

  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱里承欢。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值