《The Missing Semester of Your CS Education》(中文:《计算机教育中缺失的一课》)是 MIT 给 CS 专业的学生开设的一门「如何使用计算机工具」的一门课程。正如课程介绍所说的那样:本门课程主要讲述命令行、强大的文本编辑器的使用、版本控制的特性等 。我觉得这门课比较实用,而且比较有意思,所以就学习了这门课。

需要注意的是:在学习这门课的过程中,并不会将每个知识点都记录下来,而仅记录我平时没有注意到的、很少使用到的、没有见过的命令或知识点。这是因为之前看过《鸟哥的 Linux 私房菜》,对 Linux 已经有了一些了解。因此,该系列的学习对我来说更像是查漏补缺。

目录如下:

本文是对 Shell 的介绍,下面将一些需要注意的地方记录下来。

如何在 Linux 下的终端进行清屏操作?以前我经常使用clear,而现在可以使用 Ctrl+l。(注意:是小写字母 L)

它俩的区别在于:使用clear则不能通过滚动条查看以往的命令操作历史,而 Ctrl+l 可以。

对于重定向命令:><。前者可以将一个命令的输出重定向到一个文件中,后者可以将输入重定向到一个文件中。

例如:使用echo输出hello,然后使用>hello存储到hello.txt文件中,最后再输出hello.txt文件中的内容。

1
2
3
4
5
6
carol@ubuntu-carol:~/learnShell$ echo hello
hello
carol@ubuntu-carol:~/learnShell$ echo hello > hello.txt
carol@ubuntu-carol:~/learnShell$ cat hello.txt 
hello
carol@ubuntu-carol:~/learnShell$ 

例如:将hello.txt文件中的内容重定向给cat命令,然后再直接重定向到hello2.txt文件中。

1
2
3
4
carol@ubuntu-carol:~/learnShell$ cat < hello.txt > hello2.txt
carol@ubuntu-carol:~/learnShell$ cat hello2.txt 
hello
carol@ubuntu-carol:~/learnShell$ 

使用>>以追加的方式,将指定的内容重定向到文件中。

1
2
3
4
5
carol@ubuntu-carol:~/learnShell$ cat < hello.txt >> hello2.txt 
carol@ubuntu-carol:~/learnShell$ cat hello2.txt 
hello
hello
carol@ubuntu-carol:~/learnShell$ 

使用管道命令|,将管道命令之前的输出作为管道命令之后的输入。

tail 命令的意思是:从输出内容的最后一行往前几行看,默认输出最后 10 行的内容。但这里指定要输出最后一行的内容。

1
2
3
carol@ubuntu-carol:~/learnShell$ ls -l / | tail -n1
drwxr-xr-x  14 root root       4096 Aug  1 00:35 var
carol@ubuntu-carol:~/learnShell$

当然,我们也可以将输出的内容重定向到一个文件中,如下所示:

1
2
3
4
5
carol@ubuntu-carol:~/learnShell$ ls -l / | tail -n2 > ls.txt
carol@ubuntu-carol:~/learnShell$ cat ls.txt 
drwxr-xr-x  14 root root       4096 Aug  1 00:28 usr
drwxr-xr-x  14 root root       4096 Aug  1 00:35 var
carol@ubuntu-carol:~/learnShell$ 

管道命令还可以这么使用。

这里使用 grep 中的 -i 来忽略字符串 content-length 的大小写,以便匹配到 content-length 这一行,从而进行输出。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
carol@ubuntu-carol:~/learnShell$ curl --head --silent www.baidu.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: keep-alive
Content-Length: 277
Content-Type: text/html
Date: Thu, 26 Nov 2020 08:22:06 GMT
Etag: "575e1f5c-115"
Last-Modified: Mon, 13 Jun 2016 02:50:04 GMT
Pragma: no-cache
Server: bfe/1.0.8.18

carol@ubuntu-carol:~/learnShell$ curl --head --silent www.baidu.com | grep -i content-length
Content-Length: 277

如果想要获得Content-Length: 277中的277,则如下所示:

这里使用 cut 中的 delimiter 指明分隔符为空格。分隔之后,原始的Content-Length: 277就变成了两部分:Content-Length:277,然后使用 -f 指明我想要获取第二个部分,即227

1
2
3
carol@ubuntu-carol:~/learnShell$ curl --head --silent www.baidu.com | grep -i content-length | cut --delimiter=' ' -f2
277
carol@ubuntu-carol:~/learnShell$

值得一提的是:可以看到,在上面的命令行中,对于当前的用户carol来说,它的终端总是以$结尾。而如果我们使用root作为登录用户的话,则终端会变成以#结尾。如下所示:

这里的确是使用root登录了,但是由于我使用了 oh-my-zsh,因此,最终的效果在显示时会有所不同。

1
2
3
4
carol@ubuntu-carol:~$ pwd
/home/carol
carol@ubuntu-carol:~$ sudo su
➜  carol    

下图是在不安装 oh-my-zsh 的情况下,正常显示的结果。可以看到,用户名从jon变成了root,同时符号从$变成了#

image.png

tee命令的作用是从标准输入中读取内容并写到标准输出中或文件中。你会看到,在使用tee后,对于想要写入到number.txt中的内容1060来说,它被打印了出来。因此,使用该命名相对其它写入命令来说更加安全一些,因为你可以看见其输出的内容。

1
2
3
4
5
6
7
carol@ubuntu-carol:~/learnShell$ ls
hello2.txt  hello.txt  ls.txt
carol@ubuntu-carol:~/learnShell$ echo 1060 | tee number.txt
1060
carol@ubuntu-carol:~/learnShell$ cat number.txt 
1060
carol@ubuntu-carol:~/learnShell$ 

对于xdg-open命令,在用户的首选应用程序中打开文件或 URL。例如,使用默认的浏览器打开index.html文件。

1
2
3
carol@ubuntu-carol:~/learnShell$ xdg-open index.html 
carol@ubuntu-carol:~/learnShell$ man xdg-open
carol@ubuntu-carol:~/learnShell$ 

至于其它的如cdlsecho等基础命令,这里就不涉及了。