作者 | 梁唐 出品 | 公众号:Coder梁(ID:Coder_LT) 大家好,日拱一卒,我是梁唐。 不知道大家有没有这样一种体验,在实际写代码或者是工作、做项目的过程当中经常被一些简单的问题难住。比如vim的一些命令不熟悉,或者是git的一些操作不知道怎么弄,命令行除了 别说是还没毕业的学生了,即使是一些毕业多年的程序员老鸟也难免会查查谷歌或者Stack Overflow。我每次遇到这样问题的时候总会忍不住想, 要是上学的时候学校里能专门开一门课程讲一讲这些基本工具的使用,给学生做一个深度的科普,该有多好。 也许是听到了众多程序员的心声,2020年的时候,MIT开设了一门公开课。它的标题很有意思,叫做《missing smester》,消失的学期。课程当中收录的正是这些大部分学校课程当中不会专门涉及,但是又至关重要的基础知识。 课程量不算大,算上最后的答疑部分,一共也只有十一节课。但这十一节课当中包含了命令行、git、vim等许多非常重要的知识和技能,非常非常值得一看。 虽然课程里讲的内容非常基础,但温故知新,我也收获了非常多。因此强烈推荐给大家。 这门课在B站上也有搬运,链接:https://www.bilibili.com/video/BV1x7411H7wa?spm_id_from=333.337.search-card.all.click 这门课的notes写得非常好,这个系列是这门课notes的一个翻译和整理。如果想看英文原文,可以点击最下方【阅读原文】。 动机作为计算机科学家,我们知道计算机非常擅长处理高重复性的任务。 然而我们尝尝忽略,我们使用计算机的过程其实和计算机处理程序时类似,也一样充满了重复。我们在处理计算机相关的问题上拥有大量的工具可以使用,只需要动动手指输入命令或程序,就可以完成一些高度复杂的任务。 然而,我们当中的很多人,只使用了这些工具的很小一部分。有时候仅仅是死记硬背了一些命令,或者是在遇到困难的时候,盲目地从网上复制粘贴命令。 这门课视图解决这个问题,我们希望教会你如何最大限度地使用这些工具,给你展示一些新的工具丰富你的技能树,给你更多的鼓舞和兴趣,让你勇敢地探索。这就是我们对计算机科学领域中消失的学期的定义。 课程结构这门课包含了11个长度约1小时的课程,每一节课都有一个特定的主题。 每节课之间都是高度独立的,但在课程进行的过程当中,我们还是会假设你已经学会了之前的内容。我们会把课程的笔记公开在网上,但也有很多课上的内容是笔记里没有的。上课的视频也同样会放在网上。 我们尝试着在11小时的课程当中尽可能多地包含基础知识,所以课程的内容会比较密集。为了保证你们能顺利地跟上节奏,每节课后都会有针对要点的一系列练习。 由于时间的限制,所以没办法对所有的工具都进行深入的探讨。可能的话,我们会试着提供继续钻研和学习的资源。 Topic 1: The Shell什么是 shell?现代的计算机拥有大量的方式和用户进行交互,美观的用户界面、声音甚至是AR或者是VR都已经逐渐普及。 对于80%的用户来说,这已经足够了,但这也意味着很多基本功能的限制。因为你没办法进行图形界面中没有的操作,也没办法声控一个没有开发的功能。为了充分应用计算机的功能,解除图形界面的限制,我们需要回到上古时期,使用文本界面来控制计算机,这个就是shell。 几乎所有的平台都有shell,只不过它们的形式可能不同。尽管细节上有所区别,但核心都是一样的:允许你运行程序,输入指令,显示结果。 在这节课当中,我们将聚焦在Bourne Again Shell上,简称 使用shell当你打开terminal,你会看到一个光标,大概长这样: ![]() 这个是shell的主要文本界面,它告诉你,你当前的工作路径是机器上
![]() 现在我们运行了 ![]() 在这个例子当中,我们告诉shell运行一个叫做
但shell是怎么知道去哪里寻找 其实shell只是一个编程环境,就像是Python和Ruby一样,所以它也有变量、条件、循环和函数。当你在shell中运行命令的时候,你其实是编写了一个简易的代码交给了shell来解释运行。 当shell被要求运行一个不是shell中的关键字的命令时,它会去环境变量 ![]() 当我们运行 当找到之后,就会进行运行(假设有权限运行,权限这部分之后讲解)。我们可以使用命令 shell中的指引shell中的path是一系列文件夹组成的list,在Linux和macOS当中以 在Linux和macOS当中, 以 ![]() 注意,图中的shell提示了我们当前所在的路径,这是可以配置的。你可以修改你的终端的配置,显示所有你需要的信息,这也会在之后的课程当中提及。 总的来说,当我们运行一个程序时,除非指定,它会在当前目录运行。 查看当前路径中的内容,可以使用 ![]() 除非我们在第一个参数中输入一个路径,否则它会列出当前路径下的内容。 大多数命令都会有flags和options,通过 比如 ![]() 加上参数 ![]() 开头的 第一组 第二组 第三组 要进入一个路径,用户必须拥有这个文件夹以及它所有父路径的search(运行)权限,要列出文件夹中的内容,用户需要有文件夹的读权限。 需要注意 其他一些很有用的命令还有 如果你想要知道一个程序参数、输入、输出的更多信息,你可以使用 ![]() Connecting programs在shell当中,程序拥有两个流,即输入流和输出流。当程序试着读入数据时,它是从输入流获取的。当它试着输出时,也是向输出流进行传输。 一般来说,程序的输入和输出设备都是你的终端,也就是以我们的键盘作为输入,以屏幕作为输出。然而,我们可以修改这些流。 最简单的方式就是重定向流,比如 ![]() 像是上面例子所演示的, 你也可以使用 ![]() 在本节课中,不会太过深入管道的细节,以及它的优势,这部分放在之后的课程中。 多功能且强大的工具在大多数类Unix系统当中,有一种用户是特殊的,它就是root。 root用户超越了所有权限的限制,它可以创建、读入、更新、删除系统中的任何文件。然而,你不能一直使用root,因为这会非常危险,可能破坏你的系统或者是导致不可逆伤害。 你可以使用 有一件你必须要是root才可以做的事情:修改系统文件。 系统文件通常挂载在 比如,你可以通过修改一个名叫 ![]() 通过往文件中写入一个特定的值,你可以修改屏幕的亮度。 你的整个执行过程可能是这样的(你可能需要先通过 $ sudo find -L /sys/class/backlight -maxdepth 2 -name '*brightness*' 出乎我们意料的是,虽然我们使用了 这是shell中一个我们需要了解非常重要的信息,像是 在上面的例子中,shell在
你可以控制 $ echo 1 | sudo tee /sys/class/leds/input6::scrolllock/brightness Next steps现在你已经了解了shell的一些基本应用,可以来完成一些基础功能了。 你应该可以跳转到任何你感兴趣的路径下,并且能够使用基础命令的绝大多数功能了。在下节课当中,我们将会接触到更多有趣的命令,并且使用shell来实现更加复杂的一些任务。 Exercises这门课每节课后都会附带一些练习,有一些是给定了指定的任务去完成,也有一些是开放式的任务,比如说尝试使用X或Y程序。我们强烈推荐你能亲自尝试。
第一行是Bash中的注释,Bash中以
答案前六题的命令为: cd /tmp ![]() 直接运行会报错,因为没有运行权限。 ![]() 使用命令给
shell能知道这个文件使用什么程序执行是因为我们在第一行加上了特殊的注释: 最后,将筛选数据写入文件: ./semester | grep 'last-modified' > ~/last-modified.txt
|
|