1 00:00:01,569 --> 00:00:04,646 好的,感谢大家的到来 2 00:00:04,646 --> 00:00:08,369 这门课叫做《计算机科学教育中缺失的一课》 3 00:00:08,369 --> 00:00:10,554 至少,我们选择这么叫这门课 4 00:00:10,589 --> 00:00:13,449 如果你不是为了这门课坐在这, 那你是走错教室了。 5 00:00:13,619 --> 00:00:17,560 我们将在这里待大约一个小时,来和大家谈谈这门课的内容 6 00:00:18,462 --> 00:00:23,052 而且我想首先和你讲讲为什么我们开展这门课 7 00:00:23,329 --> 00:00:30,728 这门课源于Anish和Jose和我在MIT的许多课程担任助教时所做的观察 8 00:00:31,204 --> 00:00:34,743 我们作为计算机科学家都知道 9 00:00:34,743 --> 00:00:38,612 计算机在处理重复任务和自动化方面非常出色 10 00:00:38,640 --> 00:00:40,830 但我们经常没能意识到 11 00:00:40,830 --> 00:00:44,917 其实有大量的工具可以让我们自己的学习过程更好 12 00:00:45,502 --> 00:00:48,374 我们可以更高效地使用我们的电脑 13 00:00:48,374 --> 00:00:51,989 因为我们可以让电脑成为我们的工具 14 00:00:51,739 --> 00:00:55,359 而不只是用来开发网页或是软件那些 15 00:00:57,259 --> 00:00:59,276 这门课就是试图解决这个问题, 16 00:00:59,276 --> 00:01:02,585 试着向大家展示一些工具 17 00:01:02,585 --> 00:01:07,753 这些工具可以在日常工作、研究和学习中发挥重要的作用 18 00:01:09,040 --> 00:01:14,867 这门课程将教授大家 19 00:01:14,910 --> 00:01:18,200 如何充分利用你已经了解的工具 20 00:01:18,200 --> 00:01:21,854 同时也会介绍一些以前你不知道的工具 21 00:01:21,854 --> 00:01:23,523 以及如何结合那些工具 22 00:01:23,523 --> 00:01:28,940 使你变得更强大 23 00:01:29,966 --> 00:01:34,630 这门课将分为11节1小时的讲座, 24 00:01:34,630 --> 00:01:38,023 每个讲座都将讲一个特定的主题 25 00:01:38,400 --> 00:01:41,439 我们的网站上把课程的主题都列出来了 26 00:01:41,439 --> 00:01:44,990 以及每个讲座的日期 27 00:01:44,990 --> 00:01:47,210 他们大多数是彼此独立的 28 00:01:47,210 --> 00:01:50,450 所以你可以选择参加你感兴趣的讲座 29 00:01:50,450 --> 00:01:55,105 但我们会假定你一直在跟进,这样当我们到后面的讲座时 30 00:01:55,109 --> 00:01:58,580 我将不会从头到尾再教你bash了 31 00:02:00,969 --> 00:02:07,259 我们也将把每一节课程的笔记和视频发布到网上 32 00:02:07,478 --> 00:02:11,299 我们还没确定发布时间,但这将会在讲座结束之后 33 00:02:11,840 --> 00:02:13,784 很明显视频只能在讲座结束之后上传了 34 00:02:14,410 --> 00:02:18,664 这门课由本人John、坐在那边的Annesh来负责 35 00:02:18,664 --> 00:02:20,850 还有Jose,他虽然现在不在这 36 00:02:20,850 --> 00:02:23,290 但是会主讲明天的课程 37 00:02:23,720 --> 00:02:28,700 请注意,我们将在这11个讲座中讲很多内容 38 00:02:29,176 --> 00:02:32,430 所以我们会相对讲的快一些 39 00:02:32,430 --> 00:02:37,080 如果有如何地方跟不上,请一定要打断我们 40 00:02:37,080 --> 00:02:39,809 或者你希望我们可以多花点时间讲解某些东西 41 00:02:39,809 --> 00:02:43,240 尽管提问打断我们,让我们知道 42 00:02:43,240 --> 00:02:51,110 每一节课之后我们将在30号楼(计算机学院的中心)9楼有答疑时间 43 00:02:51,110 --> 00:02:55,140 如果你来9楼的等候室,那个门楼那里 44 00:02:55,140 --> 00:02:59,750 你可以来试试我们准备的每节课后的练习 45 00:02:59,750 --> 00:03:03,440 或者问问课上我们讲的内容 46 00:03:03,440 --> 00:03:07,100 或者其他关于高效利用你的电脑的方面 47 00:03:09,060 --> 00:03:12,740 由于我们时间有限 48 00:03:12,740 --> 00:03:16,080 我们不会讲所有的工具和细节 49 00:03:16,080 --> 00:03:21,430 我们只会聚焦于那些有趣的工具,以及使用他们的有趣方法 50 00:03:21,430 --> 00:03:25,110 我们不一定非要深入探讨关于它们是如何运作的细节 51 00:03:25,110 --> 00:03:26,605 或者更精巧的用例 52 00:03:26,605 --> 00:03:30,050 但如果你对这些有疑问,也请来问问我们 53 00:03:30,050 --> 00:03:33,014 这里面许多工具我们都使用了很多年 54 00:03:33,690 --> 00:03:36,680 我们也许能教你怎么用这些工具做一些有趣的东西 55 00:03:37,360 --> 00:03:39,960 总之,充分利用这次上课的机会 56 00:03:40,990 --> 00:03:44,803 这节课我不想讲得特别快 57 00:03:45,104 --> 00:03:50,330 这节课上, 我会讲一些基础知识 58 00:03:50,360 --> 00:03:53,345 在后面的课程中,我们会假定你都掌握 59 00:03:53,505 --> 00:03:55,654 比如如何使用shell和终端 60 00:03:55,654 --> 00:03:58,850 对于那些不熟悉这些工具的人,我将在讲座中进行解释 61 00:03:58,930 --> 00:04:03,192 然后之后我们会很快讲到更高级的工具,以及如何使用它们 62 00:04:03,192 --> 00:04:06,990 你可以从课堂笔记中看到我们将要讲的主题 63 00:04:08,177 --> 00:04:10,487 那么,现在开始今天的讲座 64 00:04:10,487 --> 00:04:12,357 我们今天讲到shell 65 00:04:12,668 --> 00:04:17,587 当你熟悉的图形界面无法实现你想要的功能时 66 00:04:17,587 --> 00:04:23,203 shell将成为你和电脑交互的主要方式之一 67 00:04:24,471 --> 00:04:27,925 图形界面的功能是十分局限的 68 00:04:27,925 --> 00:04:32,185 因为你只能使用图形界面上的按钮、滑块和输入框 69 00:04:32,871 --> 00:04:37,290 而这些文本工具通常可以可以互相组合起来 70 00:04:37,290 --> 00:04:42,084 可以使用许多不同的组合或编程方式实现自动化 71 00:04:42,390 --> 00:04:46,785 我们将专注于这些基于命令行或者文本的工具 72 00:04:47,282 --> 00:04:51,282 shell就是实现这些工作的主要工具之一 73 00:04:51,282 --> 00:04:53,352 对于那些不熟悉shell的人 74 00:04:53,352 --> 00:04:56,531 大多数平台都提供了某种形式的shell 75 00:04:56,531 --> 00:04:58,841 在Windows上,通常是PowerShell 76 00:04:59,035 --> 00:05:01,525 但也有其它Shell可用 77 00:05:01,972 --> 00:05:04,763 在Linux上,你可以找到许多终端(Terminal) 78 00:05:04,939 --> 00:05:07,819 终端是能显示Shell的窗口 79 00:05:07,819 --> 00:05:10,239 你也能找到许多不同类型的Shell 80 00:05:10,397 --> 00:05:14,397 其中最常见的Shell是BASH(the Bourne Again SHell) 81 00:05:14,848 --> 00:05:16,418 因为BASH是最常见的Shell 82 00:05:16,418 --> 00:05:19,548 所以它将会在我们的讲座中重点讲解 83 00:05:19,636 --> 00:05:22,455 如果你使用Mac os,你可能也有BASH 84 00:05:22,455 --> 00:05:25,270 但是打开终端的时候可能出现一个较旧的版本 85 00:05:25,406 --> 00:05:28,895 如果你想跟随我们的课程学习,请随意选择平台 86 00:05:28,895 --> 00:05:32,895 但是我们的教学是基于Linux的 87 00:05:32,895 --> 00:05:35,545 尽管这些工具在所有平台都能使用 88 00:05:37,411 --> 00:05:41,411 如果你不知道怎么安装终端和Shell 89 00:05:41,701 --> 00:05:44,516 我们很乐意在办公时间为你展示 90 00:05:44,516 --> 00:05:47,770 或者简单地在Google上搜索 91 00:05:47,770 --> 00:05:52,112 “你的平台+终端”。 你就能找到教程 92 00:05:55,143 --> 00:05:57,783 现在,当你打开终端 93 00:05:57,783 --> 00:06:00,283 你会看到一个类似这个的界面 94 00:06:00,283 --> 00:06:04,043 通常只有一行在顶部 95 00:06:04,043 --> 00:06:06,024 这就是所谓的Shell提示符 96 00:06:06,024 --> 00:06:08,463 你可以看到我的Shell提示符是这样的 97 00:06:08,463 --> 00:06:11,230 上面有我的用户名,机器的名称 98 00:06:11,230 --> 00:06:15,230 当前的路径(我们稍后会讨论路径) 99 00:06:15,783 --> 00:06:19,443 还有闪烁的光标等待我的输入 100 00:06:19,699 --> 00:06:22,689 这就是Shell提示符,你可以告诉Shell你想让它做什么 101 00:06:24,951 --> 00:06:27,161 你也可以配置Shell提示符 102 00:06:27,167 --> 00:06:30,017 当你在机器上打开它时,它可能不会完全像这样 103 00:06:30,178 --> 00:06:33,836 如果你配置了一些东西,它可能会像这样 104 00:06:33,836 --> 00:06:35,856 或者呈现出各种不同的样子 105 00:06:37,231 --> 00:06:41,231 我们不会在这个讲座上太多地讨论自定义你的Shell 106 00:06:41,475 --> 00:06:45,475 在这里我们只会讲怎么使用Shell做有用的事情 107 00:06:47,441 --> 00:06:51,392 这是你与计算机进行文本界面交互的主要方式 108 00:06:51,392 --> 00:06:54,267 在Shell提示符后面,你可以输入命令 109 00:06:54,267 --> 00:06:57,137 命令通常是相对简单的东西 110 00:06:57,620 --> 00:07:01,431 通常是像使用参数启动程序之类的事情 111 00:07:01,442 --> 00:07:02,504 这是什么样子的呢? 112 00:07:02,504 --> 00:07:04,834 我们可以执行一个date程序 113 00:07:04,834 --> 00:07:06,754 输入date,然后按下回车键 114 00:07:06,754 --> 00:07:09,064 然后它就会显示日期与时间 115 00:07:09,802 --> 00:07:12,305 你也可以在运行程序的时候加上参数 116 00:07:12,305 --> 00:07:16,305 这是改变程序行为的一种方式 117 00:07:16,709 --> 00:07:18,799 例如,有一个程序叫“echo” 118 00:07:18,799 --> 00:07:22,408 echo会直接输出你给它的参数 119 00:07:22,408 --> 00:07:26,806 参数就是附加在命令后面以空格分割的东西 120 00:07:26,806 --> 00:07:28,773 那么,我们输入 Hello 121 00:07:28,773 --> 00:07:30,553 程序就会把hello输出 122 00:07:31,360 --> 00:07:32,499 这也许并不令人意外 123 00:07:32,710 --> 00:07:35,250 这就是参数的基础使用 124 00:07:35,427 --> 00:07:39,177 你可能注意到参数是由空格分隔的 125 00:07:39,519 --> 00:07:42,542 你可能会想,那我该怎么输入由多个单词组成的参数呢? 126 00:07:42,911 --> 00:07:44,201 你可以用引号把参数包起来 127 00:07:44,201 --> 00:07:47,561 这样你就可以做 echo "Hello World" 这样的事情 128 00:07:48,722 --> 00:07:51,495 现在echo接收到一个字符串参数 129 00:07:51,495 --> 00:07:54,269 包含空格的 "Hello World" 130 00:07:54,990 --> 00:07:57,130 你也可以用单引号做这件事 131 00:07:57,130 --> 00:07:59,252 单引号和双引号的区别 132 00:07:59,334 --> 00:08:01,735 我们会在讲到Bash脚本的时候再讨论 133 00:08:03,360 --> 00:08:04,980 你也可以转义单个字符 134 00:08:05,935 --> 00:08:10,980 例如 Hello\ World,这样也是可以的 135 00:08:11,200 --> 00:08:13,837 后面我们会讲到如何转义 136 00:08:13,837 --> 00:08:19,332 和解析各种参数和变量的规则 137 00:08:19,546 --> 00:08:22,382 希望你不会遇到太多问题 138 00:08:22,382 --> 00:08:25,774 至少要记住空格分隔参数就好 139 00:08:25,944 --> 00:08:29,417 例如,如果你想创建一个名为 my photos 的目录 140 00:08:29,495 --> 00:08:32,615 你不能只输入 "mkdir my photos" 141 00:08:32,615 --> 00:08:35,829 这样会创建两个目录,一个叫 my 另一个叫 photos 142 00:08:35,829 --> 00:08:37,359 这可能不是你想要的 143 00:08:39,115 --> 00:08:42,542 现在你可能会问的一个问题是 144 00:08:42,542 --> 00:08:45,317 当我输入 date 或者 echo 的时候 145 00:08:45,317 --> 00:08:48,183 Shell如何知道这些程序是什么 146 00:08:48,183 --> 00:08:51,153 Shell怎么知道这些程序要做什么呢? 147 00:08:52,356 --> 00:08:57,138 答案是,有一些内置程序,是你的计算机中自带的 148 00:08:57,346 --> 00:09:01,536 你的机器可能自带终端 149 00:09:01,536 --> 00:09:04,905 或者可能自带Windows资源管理器 150 00:09:04,905 --> 00:09:07,191 或者可能自带某种浏览器 151 00:09:07,191 --> 00:09:10,626 它还会附带一系列面向命令行的程序 152 00:09:10,626 --> 00:09:13,286 这些程序存储在你的文件系统中 153 00:09:13,628 --> 00:09:18,302 并且Shell有确定程序存储位置的方法 154 00:09:18,302 --> 00:09:20,771 简而言之,搜索程序的方法 155 00:09:21,187 --> 00:09:26,994 它通过一种名为环境变量的东西来实现这一点 156 00:09:27,413 --> 00:09:31,413 环境变量是一种变量,就像编程语言中的变量一样 157 00:09:31,864 --> 00:09:35,204 事实证明,Shell,特别是Bash(the Bourne Again SHell) 158 00:09:35,204 --> 00:09:37,311 真的是一种编程语言 159 00:09:37,311 --> 00:09:42,350 这里的提示符不仅能运行带有参数的程序 160 00:09:42,350 --> 00:09:46,655 你还可以做 while循环、for循环、条件判断…… 161 00:09:46,655 --> 00:09:51,300 不仅如此,你甚至可以在Shell中定义函数、变量 162 00:09:51,300 --> 00:09:54,790 我们将在下一节课中讲解这些内容,也就是Shell 脚本 163 00:09:56,890 --> 00:09:59,879 现在,我们只看看这个特定的环境变量 164 00:09:59,894 --> 00:10:03,540 环境变量是在启动Shell时设置的 165 00:10:03,540 --> 00:10:06,400 不需要每次启动Shell都要设置的东西 166 00:10:06,400 --> 00:10:07,804 有一堆这样的变量已经设置好了 167 00:10:07,804 --> 00:10:09,391 例如你的主目录在哪里 168 00:10:09,391 --> 00:10:10,581 你的用户名是什么 169 00:10:10,581 --> 00:10:15,565 要查看搜索路径,有一个重要的变量,即路径变量 170 00:10:15,935 --> 00:10:18,824 如果我输入 echo $PATH 171 00:10:18,827 --> 00:10:22,897 它会显示路径变量的列表 172 00:10:22,897 --> 00:10:25,516 Shell就是在这些路径里搜索程序的 173 00:10:25,976 --> 00:10:29,782 你可能会注意到这是一个由冒号 : 分隔的列表 174 00:10:29,785 --> 00:10:31,995 它可能有点长并且难以阅读 175 00:10:32,353 --> 00:10:36,564 但是本质是,每当你输入程序名时 176 00:10:36,564 --> 00:10:40,579 Bash就会在这个路径列表中搜索 177 00:10:40,579 --> 00:10:44,166 并在每个目录中查找 178 00:10:44,166 --> 00:10:47,933 与你输入的名称相同的程序或文件 179 00:10:48,761 --> 00:10:50,929 因此,当我尝试运行 date 或者 echo 时 180 00:10:50,929 --> 00:10:52,818 它将逐个遍历路径列表 181 00:10:52,818 --> 00:10:55,948 直到在某个路径找到叫 date 或者 echo 的程序 182 00:10:55,948 --> 00:10:57,800 然后运行对应的程序 183 00:10:57,770 --> 00:11:00,280 如果我们想知道实际运行的是哪个程序 184 00:11:00,280 --> 00:11:02,112 可以通过一个叫 which 的命令 185 00:11:02,234 --> 00:11:04,400 我输入 which echo 186 00:11:04,575 --> 00:11:08,435 它会告诉我,如果我想运行一个叫 echo 的程序 187 00:11:08,435 --> 00:11:09,685 我会运行这一个 188 00:11:10,370 --> 00:11:14,370 现在我们停下来来谈谈路径是什么 189 00:11:14,370 --> 00:11:18,621 路径是一种描述计算机上文件位置的方式 190 00:11:19,134 --> 00:11:24,280 在 Linux 和 Mac OS上,路径是由斜杠分隔的,正斜杠 / 191 00:11:24,619 --> 00:11:29,584 你会看到这是根目录 192 00:11:29,814 --> 00:11:34,610 斜杠在路径的开头,表示这是文件系统的顶部 193 00:11:34,702 --> 00:11:38,702 然后进入到名为 usr 的目录 194 00:11:38,702 --> 00:11:41,622 然后进入到名为 bin 的目录 195 00:11:41,622 --> 00:11:43,687 然后查找名为 echo 的文件 196 00:11:44,327 --> 00:11:48,383 在 Windows上,路径是由反斜杠 \ 分隔的 197 00:11:48,746 --> 00:11:53,556 在 Linux 和 Mac OS 中,所有内容都属于根命名空间 198 00:11:53,556 --> 00:11:57,385 所有的绝对路径都以斜杠开头 199 00:11:57,805 --> 00:12:01,351 在 Windows 下,每个分区都有一个根目录 200 00:12:01,789 --> 00:12:05,789 你可能会看到类似于 C:\ D:\ 201 00:12:06,400 --> 00:12:13,840 所以在Windows中,每个驱动器都有独立的文件系统路径层次结构。 202 00:12:13,840 --> 00:12:16,704 在 Linux 和 Mac OS 中,它们都挂载到了同一个命名空间下 203 00:12:17,645 --> 00:12:20,805 你可能已经注意到我说了绝对路径这个词 204 00:12:20,825 --> 00:12:23,125 你可能不知道这是什么意思 205 00:12:23,597 --> 00:12:29,537 绝对路径是能完全确定文件位置的路径 206 00:12:29,857 --> 00:12:34,025 在这种情况下,这个路径能完全确定 echo 程序的位置 207 00:12:34,030 --> 00:12:37,570 它提供了指向该文件的完整路径 208 00:12:37,802 --> 00:12:41,442 但也存在相对路径的概念 209 00:12:42,429 --> 00:12:46,429 相对路径是相对于当前位置的路径 210 00:12:48,408 --> 00:12:54,499 确定当前位置的方法是输入pwd(print working directory)