好的，感谢大家的到来
这门课叫做《计算机科学教育中缺失的一课》
至少，我们选择这么叫这门课
如果你不是为了这门课坐在这， 那你是走错教室了。
我们将在这里待大约一个小时，来和大家谈谈这门课的内容
而且我想首先和你讲讲为什么我们开展这门课
这门课源于Anish和Jose和我在MIT的许多课程担任助教时所做的观察
我们作为计算机科学家都知道
计算机在处理重复任务和自动化方面非常出色
但我们经常没能意识到
其实有大量的工具可以让我们自己的学习过程更好
我们可以更高效地使用我们的电脑
因为我们可以让电脑成为我们的工具
而不只是用来开发网页或是软件那些
这门课就是试图解决这个问题，
试着向大家展示一些工具
这些工具可以在日常工作、研究和学习中发挥重要的作用
这门课程将教授大家
如何充分利用你已经了解的工具
同时也会介绍一些以前你不知道的工具
以及如何结合那些工具
使你变得更强大
这门课将分为11节1小时的讲座，
每个讲座都将讲一个特定的主题
我们的网站上把课程的主题都列出来了
以及每个讲座的日期
他们大多数是彼此独立的
所以你可以选择参加你感兴趣的讲座
但我们会假定你一直在跟进，这样当我们到后面的讲座时
我将不会从头到尾再教你bash了
我们也将把每一节课程的笔记和视频发布到网上
我们还没确定发布时间，但这将会在讲座结束之后
很明显视频只能在讲座结束之后上传了
这门课由本人John、坐在那边的Annesh来负责
还有Jose，他虽然现在不在这
但是会主讲明天的课程
请注意，我们将在这11个讲座中讲很多内容
所以我们会相对讲的快一些
如果有如何地方跟不上，请一定要打断我们
或者你希望我们可以多花点时间讲解某些东西
尽管提问打断我们，让我们知道
每一节课之后我们将在30号楼（计算机学院的中心）9楼有答疑时间
如果你来9楼的等候室，那个门楼那里
你可以来试试我们准备的每节课后的练习
或者问问课上我们讲的内容
或者其他关于高效利用你的电脑的方面
由于我们时间有限
我们不会讲所有的工具和细节
我们只会聚焦于那些有趣的工具，以及使用他们的有趣方法
我们不一定非要深入探讨关于它们是如何运作的细节
或者更精巧的用例
但如果你对这些有疑问，也请来问问我们
这里面许多工具我们都使用了很多年
我们也许能教你怎么用这些工具做一些有趣的东西
总之，充分利用这次上课的机会
这节课我不想讲得特别快
这节课上， 我会讲一些基础知识
在后面的课程中，我们会假定你都掌握
比如如何使用shell和终端
对于那些不熟悉这些工具的人，我将在讲座中进行解释
然后之后我们会很快讲到更高级的工具，以及如何使用它们
你可以从课堂笔记中看到我们将要讲的主题
那么，现在开始今天的讲座
我们今天讲到shell
当你熟悉的图形界面无法实现你想要的功能时
shell将成为你和电脑交互的主要方式之一
图形界面的功能是十分局限的
因为你只能使用图形界面上的按钮、滑块和输入框
而这些文本工具通常可以可以互相组合起来
可以使用许多不同的组合或编程方式实现自动化
我们将专注于这些基于命令行或者文本的工具
shell就是实现这些工作的主要工具之一
对于那些不熟悉shell的人
大多数平台都提供了某种形式的shell
在Windows上，通常是PowerShell
但也有其它Shell可用
在Linux上，你可以找到许多终端（Terminal）
终端是能显示Shell的窗口
你也能找到许多不同类型的Shell
其中最常见的Shell是BASH（the Bourne Again SHell）
因为BASH是最常见的Shell
所以它将会在我们的讲座中重点讲解
如果你使用Mac os，你可能也有BASH
但是打开终端的时候可能出现一个较旧的版本
如果你想跟随我们的课程学习，请随意选择平台
但是我们的教学是基于Linux的
尽管这些工具在所有平台都能使用
如果你不知道怎么安装终端和Shell
我们很乐意在办公时间为你展示
或者简单地在Google上搜索
“你的平台+终端”。 你就能找到教程
现在，当你打开终端
你会看到一个类似这个的界面
通常只有一行在顶部
这就是所谓的Shell提示符
你可以看到我的Shell提示符是这样的
上面有我的用户名，机器的名称
当前的路径（我们稍后会讨论路径）
还有闪烁的光标等待我的输入
这就是Shell提示符，你可以告诉Shell你想让它做什么
你也可以配置Shell提示符
当你在机器上打开它时，它可能不会完全像这样
如果你配置了一些东西，它可能会像这样
或者呈现出各种不同的样子
我们不会在这个讲座上太多地讨论自定义你的Shell
在这里我们只会讲怎么使用Shell做有用的事情
这是你与计算机进行文本界面交互的主要方式
在Shell提示符后面，你可以输入命令
命令通常是相对简单的东西
通常是像使用参数启动程序之类的事情
这是什么样子的呢？
我们可以执行一个date程序
输入date，然后按下回车键
然后它就会显示日期与时间
你也可以在运行程序的时候加上参数
这是改变程序行为的一种方式
例如，有一个程序叫“echo”
echo会直接输出你给它的参数
参数就是附加在命令后面以空格分割的东西
那么，我们输入 Hello
程序就会把hello输出
这也许并不令人意外
这就是参数的基础使用
你可能注意到参数是由空格分隔的
你可能会想，那我该怎么输入由多个单词组成的参数呢？
你可以用引号把参数包起来
这样你就可以做 echo "Hello World" 这样的事情
现在echo接收到一个字符串参数
包含空格的 "Hello World"
你也可以用单引号做这件事
单引号和双引号的区别
我们会在讲到Bash脚本的时候再讨论
你也可以转义单个字符
例如 Hello\ World，这样也是可以的
后面我们会讲到如何转义
和解析各种参数和变量的规则
希望你不会遇到太多问题
至少要记住空格分隔参数就好
例如，如果你想创建一个名为 my photos 的目录
你不能只输入 "mkdir my photos"
这样会创建两个目录，一个叫 my 另一个叫 photos
这可能不是你想要的
现在你可能会问的一个问题是
当我输入 date 或者 echo 的时候
Shell如何知道这些程序是什么
Shell怎么知道这些程序要做什么呢？
答案是，有一些内置程序，是你的计算机中自带的
你的机器可能自带终端
或者可能自带Windows资源管理器
或者可能自带某种浏览器
它还会附带一系列面向命令行的程序
这些程序存储在你的文件系统中
并且Shell有确定程序存储位置的方法
简而言之，搜索程序的方法
它通过一种名为环境变量的东西来实现这一点
环境变量是一种变量，就像编程语言中的变量一样
事实证明，Shell，特别是Bash（the Bourne Again SHell）
真的是一种编程语言
这里的提示符不仅能运行带有参数的程序
你还可以做 while循环、for循环、条件判断……
不仅如此，你甚至可以在Shell中定义函数、变量
我们将在下一节课中讲解这些内容，也就是Shell 脚本
现在，我们只看看这个特定的环境变量
环境变量是在启动Shell时设置的
不需要每次启动Shell都要设置的东西
有一堆这样的变量已经设置好了
例如你的主目录在哪里
你的用户名是什么
要查看搜索路径，有一个重要的变量，即路径变量
如果我输入 echo $PATH
它会显示路径变量的列表
Shell就是在这些路径里搜索程序的
你可能会注意到这是一个由冒号 : 分隔的列表
它可能有点长并且难以阅读
但是本质是，每当你输入程序名时
Bash就会在这个路径列表中搜索
并在每个目录中查找
与你输入的名称相同的程序或文件
因此，当我尝试运行 date 或者 echo 时
它将逐个遍历路径列表
直到在某个路径找到叫 date 或者 echo 的程序
然后运行对应的程序
如果我们想知道实际运行的是哪个程序
可以通过一个叫 which 的命令
我输入 which echo
它会告诉我，如果我想运行一个叫 echo 的程序
我会运行这一个
现在我们停下来来谈谈路径是什么
路径是一种描述计算机上文件位置的方式
在 Linux 和 Mac OS上，路径是由斜杠分隔的，正斜杠 /
你会看到这是根目录
斜杠在路径的开头，表示这是文件系统的顶部
然后进入到名为 usr 的目录
然后进入到名为 bin 的目录
然后查找名为 echo 的文件
在 Windows上，路径是由反斜杠 \ 分隔的
在 Linux 和 Mac OS 中，所有内容都属于根命名空间
所有的绝对路径都以斜杠开头
在 Windows 下，每个分区都有一个根目录
你可能会看到类似于 C:\ D:\
所以在Windows中，每个驱动器都有独立的文件系统路径层次结构。
在 Linux 和 Mac OS 中，它们都挂载到了同一个命名空间下
你可能已经注意到我说了绝对路径这个词
你可能不知道这是什么意思
绝对路径是能完全确定文件位置的路径
在这种情况下，这个路径能完全确定 echo 程序的位置
它提供了指向该文件的完整路径
但也存在相对路径的概念
相对路径是相对于当前位置的路径
确定当前位置的方法是输入pwd（print working directory）