MIT 6.null Lecture Notes

课程官网:https://missing.csail.mit.edu/

中文版:https://missing-semester-cn.github.io/

视频地址:https://www.youtube.com/playlist?list=PLyzOVJj3bHQuloKGG59rS43e29ro7I57J

B站视频:https://www.bilibili.com/video/BV14E411J7n2

如题所说,这是计算机教育中缺失的一门课,主要补充一些伴随我们学生时期和工作时期的生产力工具的使用。

大学里的计算机课程通常专注于讲授从操作系统到机器学习这些学院派的课程或主题,而对于如何精通工具这一主题则往往会留给学生自行探索。在这个系列课程中,我们讲授命令行、强大的文本编辑器的使用、使用版本控制系统提供的多种特性等等。学生在他们受教育阶段就会和这些工具朝夕相处(在他们的职业生涯中更是这样)。 因此,花时间打磨使用这些工具的能力并能够最终熟练地、流畅地使用它们是非常有必要的。

精通这些工具不仅可以帮助您更快的使用工具完成任务,并且可以帮助您解决在之前看来似乎无比复杂的问题。

Lecture 1: Shell

第一个Lecture主要只是简单地介绍了一些shell命名,以及重定向和管道符。

使用Shell

首先打开shell:

1
missing:~$ 

它告诉你,你的主机名是 missing 并且您当前的工作目录(”current working directory”)或者说您当前所在的位置是 ~ (表示 “home”)。

$ 符号表示您现在的身份不是 root 用户(稍后会介绍)。在这个提示符中,您可以输入 命令 ,命令最终会被 shell 解析。

eg.

1
2
3
4
missing:~$ date
Fri 10 Jan 2020 11:49:31 AM EST
missing:~$ echo hello
hello

上例中,我们让 shell 执行 echo ,同时指定参数 helloecho 程序将该参数打印出来。 shell 基于空格分割命令并进行解析,然后执行第一个单词代表的程序,并将后续的单词作为程序可以访问的参数。如果您希望传递的参数中包含空格(例如一个名为 My Photos 的文件夹),您要么用使用单引号,双引号将其包裹起来,要么使用转义符号 \ 进行处理(My\ Photos)。

问题:shell 是如何知道去哪里寻找 dateecho 的呢?

Answer:shell 是一个编程环境,所以它具备变量、条件、循环和函数(下一课进行讲解)。当你在 shell 中执行命令时,您实际上是在执行一段 shell 可以解释执行的简短代码。如果你要求 shell 执行某个指令,但是该指令并不是 shell 所了解的编程关键字,那么它会去咨询 环境变量 $PATH,它会列出当 shell 接到某条指令时,进行程序搜索的路径:

1
2
3
4
5
6
missing:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
missing:~$ which echo
/bin/echo
missing:~$ /bin/echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

确定某个程序名代表的是哪个具体的程序,可以使用 which 程序。我们也可以绕过 $PATH,通过直接指定需要执行的程序的路径来执行该程序

Shell中路径导航

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
missing:~$ pwd
/home/missing
missing:~$ cd /home
missing:/home$ pwd
/home
missing:/home$ cd ..
missing:/$ pwd
/
missing:/$ cd ./home
missing:/home$ pwd
/home
missing:/home$ cd missing
missing:~$ pwd
/home/missing
missing:~$ ../../bin/echo hello
hello

查看文件:

1
2
3
4
5
6
7
8
9
10
11
12
missing:~$ ls
missing:~$ cd ..
missing:/home$ ls
missing
missing:/home$ cd ..
missing:/$ ls
bin
boot
dev
etc
home
...

详细信息:

1
2
missing:~$ ls -l /home
drwxr-xr-x 1 missing users 4096 Jun 15 2019 missing

这个参数可以打印出更加详细地列出目录下文件或文件夹的信息。

文件类型:

第1个字符表明这个文件的类型。

  • d表示这是一个文件夹
  • 如果是-表示这是一个普通文件
  • l表示这是一个链接文件,类似于windows下的快捷方式
  • b表示这是一个块设备文件,一般置于/dev目录下,没有文件大小,只有一个主设备号和辅设备号。块设备是一次传输一整块数据的设备,比如硬盘
  • c表示这是一个字符设备文件,一般置于/dev目录下,字符设备是一次只传输一个字符数据的设备,比如键盘
  • p表示这是一个命令管道文件,与shell编程有关
  • s表示这是一个socks文件,与shell编程有关

文件权限管理:

d后面有3*3个标志,表示不同的身份对该文件的权限。

r表示可读权限,w表示可写权限,x表示可执行权限,-表示无相应权限。

第一组表示该文件的所有者的权限,第二组表示文件所有者同组用户的权限,第三组表示其他用户的权限

PS:

权限后面的第一个数字表示

  1. 当这是一个文件时,为硬连接数,即有几个文件硬链接到了这个文件
  2. 当这是一个文件夹时,为链接占用的节点,即该目录中包含的子目录的个数

对于一个文件夹来说,为了进入这个文件夹,必须拥有”search”权限,也就是拥有对这个文件夹以及其所有父路径文件夹的x权限。为了ls这个文件夹,必须拥有这个文件夹的r权限

重定向及管道符号

重定向:

在 shell 中,程序有两个主要的“流”:它们的输入流和输出流。 当程序尝试读取信息时,它们会从输入流中进行读取,当程序打印信息时,它们会将信息输出到输出流中。 通常,一个程序的输入输出流都是终端。

< file将输入设定为文件,> file将结果输出到文件,原先文件的内容会被覆盖

1
2
3
4
5
6
7
8
missing:~$ echo hello > hello.txt
missing:~$ cat hello.txt
hello
missing:~$ cat < hello.txt
hello
missing:~$ cat < hello.txt > hello2.txt
missing:~$ cat hello2.txt
hello

>>可以来向文件附加数据。|是管道符号,可以将前一个命令的输出作为下一个命令的输入。

1
2
3
4
5
6
#tail n1列出最后一行,列出的是ls -l的输出
missing:~$ ls -l / | tail -n1
drwxr-xr-x 1 root root 4096 Jun 20 2019 var
#查看向google发送HTTP GET请求的头文件中的content length属性的值
missing:~$ curl --head --silent google.com | grep --ignore-case content-length | cut --delimiter=' ' -f2
219

Lecture 2:Shell Tools and Scripting

image-20211219200158866

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2022 Doke
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信