WEBVTT 00:00:01.569 --> 00:00:04.646 好的,感谢大家的到来 00:00:04.646 --> 00:00:08.369 这门课叫做《计算机科学教育中缺失的一课》 00:00:08.369 --> 00:00:10.554 至少,我们选择这么叫这门课 00:00:10.589 --> 00:00:13.449 如果你不是为了这门课坐在这, 那你是走错教室了。 00:00:13.619 --> 00:00:17.560 我们将在这里待大约一个小时,来和大家谈谈这门课的内容 00:00:18.462 --> 00:00:23.052 而且我想首先和你讲讲为什么我们开展这门课 00:00:23.329 --> 00:00:30.728 这门课源于Anish和Jose和我在MIT的许多课程担任助教时所做的观察 00:00:31.204 --> 00:00:34.743 我们作为计算机科学家都知道 00:00:34.743 --> 00:00:38.612 计算机在处理重复任务和自动化方面非常出色 00:00:38.640 --> 00:00:40.830 但我们经常没能意识到 00:00:40.830 --> 00:00:44.917 其实有大量的工具可以让我们自己的学习过程更好 00:00:45.502 --> 00:00:48.374 我们可以更高效地使用我们的电脑 00:00:48.374 --> 00:00:51.989 因为我们可以让电脑成为我们的工具 00:00:51.739 --> 00:00:55.359 而不只是用来开发网页或是软件那些 00:00:57.259 --> 00:00:59.276 这门课就是试图解决这个问题, 00:00:59.276 --> 00:01:02.585 试着向大家展示一些工具 00:01:02.585 --> 00:01:07.753 这些工具可以在日常工作、研究和学习中发挥重要的作用 00:01:09.040 --> 00:01:14.867 这门课程将教授大家 00:01:14.910 --> 00:01:18.200 如何充分利用你已经了解的工具 00:01:18.200 --> 00:01:21.854 同时也会介绍一些以前你不知道的工具 00:01:21.854 --> 00:01:23.523 以及如何结合那些工具 00:01:23.523 --> 00:01:28.940 使你变得更强大 00:01:29.966 --> 00:01:34.630 这门课将分为11节1小时的讲座, 00:01:34.630 --> 00:01:38.023 每个讲座都将讲一个特定的主题 00:01:38.400 --> 00:01:41.439 我们的网站上把课程的主题都列出来了 00:01:41.439 --> 00:01:44.990 以及每个讲座的日期 00:01:44.990 --> 00:01:47.210 他们大多数是彼此独立的 00:01:47.210 --> 00:01:50.450 所以你可以选择参加你感兴趣的讲座 00:01:50.450 --> 00:01:55.105 但我们会假定你一直在跟进,这样当我们到后面的讲座时 00:01:55.109 --> 00:01:58.580 我将不会从头到尾再教你bash了 00:02:00.969 --> 00:02:07.259 我们也将把每一节课程的笔记和视频发布到网上 00:02:07.478 --> 00:02:11.299 我们还没确定发布时间,但这将会在讲座结束之后 00:02:11.840 --> 00:02:13.784 很明显视频只能在讲座结束之后上传了 00:02:14.410 --> 00:02:18.664 这门课由本人John、坐在那边的Annesh来负责 00:02:18.664 --> 00:02:20.850 还有Jose,他虽然现在不在这 00:02:20.850 --> 00:02:23.290 但是会主讲明天的课程 00:02:23.720 --> 00:02:28.700 请注意,我们将在这11个讲座中讲很多内容 00:02:29.176 --> 00:02:32.430 所以我们会相对讲的快一些 00:02:32.430 --> 00:02:37.080 如果有如何地方跟不上,请一定要打断我们 00:02:37.080 --> 00:02:39.809 或者你希望我们可以多花点时间讲解某些东西 00:02:39.809 --> 00:02:43.240 尽管提问打断我们,让我们知道 00:02:43.240 --> 00:02:51.110 每一节课之后我们将在30号楼(计算机学院的中心)9楼有答疑时间 00:02:51.110 --> 00:02:55.140 如果你来9楼的等候室,那个门楼那里 00:02:55.140 --> 00:02:59.750 你可以来试试我们准备的每节课后的练习 00:02:59.750 --> 00:03:03.440 或者问问课上我们讲的内容 00:03:03.440 --> 00:03:07.100 或者其他关于高效利用你的电脑的方面 00:03:09.060 --> 00:03:12.740 由于我们时间有限 00:03:12.740 --> 00:03:16.080 我们不会讲所有的工具和细节 00:03:16.080 --> 00:03:21.430 我们只会聚焦于那些有趣的工具,以及使用他们的有趣方法 00:03:21.430 --> 00:03:25.110 我们不一定非要深入探讨关于它们是如何运作的细节 00:03:25.110 --> 00:03:26.605 或者更精巧的用例 00:03:26.605 --> 00:03:30.050 但如果你对这些有疑问,也请来问问我们 00:03:30.050 --> 00:03:33.014 这里面许多工具我们都使用了很多年 00:03:33.690 --> 00:03:36.680 我们也许能教你怎么用这些工具做一些有趣的东西 00:03:37.360 --> 00:03:39.960 总之,充分利用这次上课的机会 00:03:40.990 --> 00:03:44.803 这节课我不想讲得特别快 00:03:45.104 --> 00:03:50.330 这节课上, 我会讲一些基础知识 00:03:50.360 --> 00:03:53.345 在后面的课程中,我们会假定你都掌握 00:03:53.505 --> 00:03:55.654 比如如何使用shell和终端 00:03:55.654 --> 00:03:58.850 对于那些不熟悉这些工具的人,我将在讲座中进行解释 00:03:58.930 --> 00:04:03.192 然后之后我们会很快讲到更高级的工具,以及如何使用它们 00:04:03.192 --> 00:04:06.990 你可以从课堂笔记中看到我们将要讲的主题 00:04:08.177 --> 00:04:10.487 那么,现在开始今天的讲座 00:04:10.487 --> 00:04:12.357 我们今天讲到shell 00:04:12.668 --> 00:04:17.587 当你熟悉的图形界面无法实现你想要的功能时 00:04:17.587 --> 00:04:23.203 shell将成为你和电脑交互的主要方式之一 00:04:24.471 --> 00:04:27.925 图形界面的功能是十分局限的 00:04:27.925 --> 00:04:32.185 因为你只能使用图形界面上的按钮、滑块和输入框 00:04:32.871 --> 00:04:37.290 而这些文本工具通常可以可以互相组合起来 00:04:37.290 --> 00:04:42.084 可以使用许多不同的组合或编程方式实现自动化 00:04:42.390 --> 00:04:46.785 我们将专注于这些基于命令行或者文本的工具 00:04:47.282 --> 00:04:51.282 shell就是实现这些工作的主要工具之一 00:04:51.282 --> 00:04:53.352 对于那些不熟悉shell的人 00:04:53.352 --> 00:04:56.531 大多数平台都提供了某种形式的shell 00:04:56.531 --> 00:04:58.841 在Windows上,通常是PowerShell 00:04:59.035 --> 00:05:01.525 但也有其它Shell可用 00:05:01.972 --> 00:05:04.763 在Linux上,你可以找到许多终端(Terminal) 00:05:04.939 --> 00:05:07.819 终端是能显示Shell的窗口 00:05:07.819 --> 00:05:10.239 你也能找到许多不同类型的Shell 00:05:10.397 --> 00:05:14.397 其中最常见的Shell是BASH(the Bourne Again SHell) 00:05:14.848 --> 00:05:16.418 因为BASH是最常见的Shell 00:05:16.418 --> 00:05:19.548 所以它将会在我们的讲座中重点讲解 00:05:19.636 --> 00:05:22.455 如果你使用Mac os,你可能也有BASH 00:05:22.455 --> 00:05:25.270 但是打开终端的时候可能出现一个较旧的版本 00:05:25.406 --> 00:05:28.895 如果你想跟随我们的课程学习,请随意选择平台 00:05:28.895 --> 00:05:32.895 但是我们的教学是基于Linux的 00:05:32.895 --> 00:05:35.545 尽管这些工具在所有平台都能使用 00:05:37.411 --> 00:05:41.411 如果你不知道怎么安装终端和Shell 00:05:41.701 --> 00:05:44.516 我们很乐意在办公时间为你展示 00:05:44.516 --> 00:05:47.770 或者简单地在Google上搜索 00:05:47.770 --> 00:05:52.112 “你的平台+终端”。 你就能找到教程 00:05:55.143 --> 00:05:57.783 现在,当你打开终端 00:05:57.783 --> 00:06:00.283 你会看到一个类似这个的界面 00:06:00.283 --> 00:06:04.043 通常只有一行在顶部 00:06:04.043 --> 00:06:06.024 这就是所谓的Shell提示符 00:06:06.024 --> 00:06:08.463 你可以看到我的Shell提示符是这样的 00:06:08.463 --> 00:06:11.230 上面有我的用户名,机器的名称 00:06:11.230 --> 00:06:15.230 当前的路径(我们稍后会讨论路径) 00:06:15.783 --> 00:06:19.443 还有闪烁的光标等待我的输入 00:06:19.699 --> 00:06:22.689 这就是Shell提示符,你可以告诉Shell你想让它做什么 00:06:24.951 --> 00:06:27.161 你也可以配置Shell提示符 00:06:27.167 --> 00:06:30.017 当你在机器上打开它时,它可能不会完全像这样 00:06:30.178 --> 00:06:33.836 如果你配置了一些东西,它可能会像这样 00:06:33.836 --> 00:06:35.856 或者呈现出各种不同的样子 00:06:37.231 --> 00:06:41.231 我们不会在这个讲座上太多地讨论自定义你的Shell 00:06:41.475 --> 00:06:45.475 在这里我们只会讲怎么使用Shell做有用的事情 00:06:47.441 --> 00:06:51.392 这是你与计算机进行文本界面交互的主要方式 00:06:51.392 --> 00:06:54.267 在Shell提示符后面,你可以输入命令 00:06:54.267 --> 00:06:57.137 命令通常是相对简单的东西 00:06:57.620 --> 00:07:01.431 通常是像使用参数启动程序之类的事情 00:07:01.442 --> 00:07:02.504 这是什么样子的呢? 00:07:02.504 --> 00:07:04.834 我们可以执行一个date程序 00:07:04.834 --> 00:07:06.754 输入date,然后按下回车键 00:07:06.754 --> 00:07:09.064 然后它就会显示日期与时间 00:07:09.802 --> 00:07:12.305 你也可以在运行程序的时候加上参数 00:07:12.305 --> 00:07:16.305 这是改变程序行为的一种方式 00:07:16.709 --> 00:07:18.799 例如,有一个程序叫“echo” 00:07:18.799 --> 00:07:22.408 echo会直接输出你给它的参数 00:07:22.408 --> 00:07:26.806 参数就是附加在命令后面以空格分割的东西 00:07:26.806 --> 00:07:28.773 那么,我们输入 Hello 00:07:28.773 --> 00:07:30.553 程序就会把hello输出 00:07:31.360 --> 00:07:32.499 这也许并不令人意外 00:07:32.710 --> 00:07:35.250 这就是参数的基础使用 00:07:35.427 --> 00:07:39.177 你可能注意到参数是由空格分隔的 00:07:39.519 --> 00:07:42.542 你可能会想,那我该怎么输入由多个单词组成的参数呢? 00:07:42.911 --> 00:07:44.201 你可以用引号把参数包起来 00:07:44.201 --> 00:07:47.561 这样你就可以做 echo "Hello World" 这样的事情 00:07:48.722 --> 00:07:51.495 现在echo接收到一个字符串参数 00:07:51.495 --> 00:07:54.269 包含空格的 "Hello World" 00:07:54.990 --> 00:07:57.130 你也可以用单引号做这件事 00:07:57.130 --> 00:07:59.252 单引号和双引号的区别 00:07:59.334 --> 00:08:01.735 我们会在讲到Bash脚本的时候再讨论 00:08:03.360 --> 00:08:04.980 你也可以转义单个字符 00:08:05.935 --> 00:08:10.980 例如 Hello\ World,这样也是可以的 00:08:11.200 --> 00:08:13.837 后面我们会讲到如何转义 00:08:13.837 --> 00:08:19.332 和解析各种参数和变量的规则 00:08:19.546 --> 00:08:22.382 希望你不会遇到太多问题 00:08:22.382 --> 00:08:25.774 至少要记住空格分隔参数就好 00:08:25.944 --> 00:08:29.417 例如,如果你想创建一个名为 my photos 的目录 00:08:29.495 --> 00:08:32.615 你不能只输入 "mkdir my photos" 00:08:32.615 --> 00:08:35.829 这样会创建两个目录,一个叫 my 另一个叫 photos 00:08:35.829 --> 00:08:37.359 这可能不是你想要的 00:08:39.115 --> 00:08:42.542 现在你可能会问的一个问题是 00:08:42.542 --> 00:08:45.317 当我输入 date 或者 echo 的时候 00:08:45.317 --> 00:08:48.183 Shell如何知道这些程序是什么 00:08:48.183 --> 00:08:51.153 Shell怎么知道这些程序要做什么呢? 00:08:52.356 --> 00:08:57.138 答案是,有一些内置程序,是你的计算机中自带的 00:08:57.346 --> 00:09:01.536 你的机器可能自带终端 00:09:01.536 --> 00:09:04.905 或者可能自带Windows资源管理器 00:09:04.905 --> 00:09:07.191 或者可能自带某种浏览器 00:09:07.191 --> 00:09:10.626 它还会附带一系列面向命令行的程序 00:09:10.626 --> 00:09:13.286 这些程序存储在你的文件系统中 00:09:13.628 --> 00:09:18.302 并且Shell有确定程序存储位置的方法 00:09:18.302 --> 00:09:20.771 简而言之,搜索程序的方法 00:09:21.187 --> 00:09:26.994 它通过一种名为环境变量的东西来实现这一点 00:09:27.413 --> 00:09:31.413 环境变量是一种变量,就像编程语言中的变量一样 00:09:31.864 --> 00:09:35.204 事实证明,Shell,特别是Bash(the Bourne Again SHell) 00:09:35.204 --> 00:09:37.311 真的是一种编程语言 00:09:37.311 --> 00:09:42.350 这里的提示符不仅能运行带有参数的程序 00:09:42.350 --> 00:09:46.655 你还可以做 while循环、for循环、条件判断…… 00:09:46.655 --> 00:09:51.300 不仅如此,你甚至可以在Shell中定义函数、变量 00:09:51.300 --> 00:09:54.790 我们将在下一节课中讲解这些内容,也就是Shell 脚本 00:09:56.890 --> 00:09:59.879 现在,我们只看看这个特定的环境变量 00:09:59.894 --> 00:10:03.540 环境变量是在启动Shell时设置的 00:10:03.540 --> 00:10:06.400 不需要每次启动Shell都要设置的东西 00:10:06.400 --> 00:10:07.804 有一堆这样的变量已经设置好了 00:10:07.804 --> 00:10:09.391 例如你的主目录在哪里 00:10:09.391 --> 00:10:10.581 你的用户名是什么 00:10:10.581 --> 00:10:15.565 要查看搜索路径,有一个重要的变量,即路径变量 00:10:15.935 --> 00:10:18.824 如果我输入 echo $PATH 00:10:18.827 --> 00:10:22.897 它会显示路径变量的列表 00:10:22.897 --> 00:10:25.516 Shell就是在这些路径里搜索程序的 00:10:25.976 --> 00:10:29.782 你可能会注意到这是一个由冒号 : 分隔的列表 00:10:29.785 --> 00:10:31.995 它可能有点长并且难以阅读 00:10:32.353 --> 00:10:36.564 但是本质是,每当你输入程序名时 00:10:36.564 --> 00:10:40.579 Bash就会在这个路径列表中搜索 00:10:40.579 --> 00:10:44.166 并在每个目录中查找 00:10:44.166 --> 00:10:47.933 与你输入的名称相同的程序或文件 00:10:48.761 --> 00:10:50.929 因此,当我尝试运行 date 或者 echo 时 00:10:50.929 --> 00:10:52.818 它将逐个遍历路径列表 00:10:52.818 --> 00:10:55.948 直到在某个路径找到叫 date 或者 echo 的程序 00:10:55.948 --> 00:10:57.800 然后运行对应的程序 00:10:57.770 --> 00:11:00.280 如果我们想知道实际运行的是哪个程序 00:11:00.280 --> 00:11:02.112 可以通过一个叫 which 的命令 00:11:02.234 --> 00:11:04.400 我输入 which echo 00:11:04.575 --> 00:11:08.435 它会告诉我,如果我想运行一个叫 echo 的程序 00:11:08.435 --> 00:11:09.685 我会运行这一个 00:11:10.370 --> 00:11:14.370 现在我们停下来来谈谈路径是什么 00:11:14.370 --> 00:11:18.621 路径是一种描述计算机上文件位置的方式 00:11:19.134 --> 00:11:24.280 在 Linux 和 Mac OS上,路径是由斜杠分隔的,正斜杠 / 00:11:24.619 --> 00:11:29.584 你会看到这是根目录 00:11:29.814 --> 00:11:34.610 斜杠在路径的开头,表示这是文件系统的顶部 00:11:34.702 --> 00:11:38.702 然后进入到名为 usr 的目录 00:11:38.702 --> 00:11:41.622 然后进入到名为 bin 的目录 00:11:41.622 --> 00:11:43.687 然后查找名为 echo 的文件 00:11:44.327 --> 00:11:48.383 在 Windows上,路径是由反斜杠 \ 分隔的 00:11:48.746 --> 00:11:53.556 在 Linux 和 Mac OS 中,所有内容都属于根命名空间 00:11:53.556 --> 00:11:57.385 所有的绝对路径都以斜杠开头 00:11:57.805 --> 00:12:01.351 在 Windows 下,每个分区都有一个根目录 00:12:01.789 --> 00:12:05.789 你可能会看到类似于 C:\ D:\ 00:12:06.400 --> 00:12:13.840 所以在Windows中,每个驱动器都有独立的文件系统路径层次结构。 00:12:13.840 --> 00:12:16.704 在 Linux 和 Mac OS 中,它们都挂载到了同一个命名空间下 00:12:17.645 --> 00:12:20.805 你可能已经注意到我说了绝对路径这个词 00:12:20.825 --> 00:12:23.125 你可能不知道这是什么意思 00:12:23.597 --> 00:12:29.537 绝对路径是能完全确定文件位置的路径 00:12:29.857 --> 00:12:34.025 在这种情况下,这个路径能完全确定 echo 程序的位置 00:12:34.030 --> 00:12:37.570 它提供了指向该文件的完整路径 00:12:37.802 --> 00:12:41.442 但也存在相对路径的概念 00:12:42.429 --> 00:12:46.429 相对路径是相对于当前位置的路径 00:12:48.408 --> 00:12:54.499 确定当前位置的方法是输入pwd(print working directory)