兰乔圣地牙哥学院的 Linux

大约每年两次,我发现自己在《洛杉矶时报》上搜索 Unix 的招聘广告。幸运的是,这并不意味着我经常失业。事实上,除了我整合、支持和教授 Unix 的全职工作外,我还是加利福尼亚州圣安娜市兰乔圣地牙哥社区学院的兼职讲师。每个学期第一堂课的第一个小时,停车场都像丛林一样,学生们都在努力寻找正确的建筑物和教室。我利用这个小时来讨论最近的 Unix 招聘广告和“流行语”。我介绍学生将在我的课堂上学到什么,以及雇主在这些广告中最常列出的其他技能。在 97 年 1 月,雇主最常需要的是 Unix 加 C 编程或 Unix 加 Windows NT(网络)。广告很少提及特定的 Unix 操作系统类型,例如 HP、Sun 或 Linux。
我在我的课堂上广泛使用 Linux。我也使用免费版本的 SCO Unix。我在兰乔教授一系列三个完整的学期 Unix 课程
CMPR 141:Unix 操作系统
CMPR 241:Unix 系统管理
CMPR 242:高级 Unix Shell 脚本
在这些课程中的每一门课中,我都使用我的汽车收音机类比。汽车收音机有很多不同的款式,每种款式的旋钮和控件的位置都略有不同;然而,当大多数人进入一辆陌生的汽车时,他们可以打开收音机,调节音量,更换电台,甚至可以设置他们喜欢的电台。同样,不同计算机平台上的 Unix 在基本命令方面也有差异,例如,如何注销或如何一次显示一页文件。当您面对一个陌生的汽车收音机时,无需感到迷茫,哦……我的意思是当您面对一个新的 Unix 变体时,尤其是在您使用互联网,使用 TELNET 访问一个主机或另一个主机时。虽然 Linux 有您在其他 Unix 版本中找不到的特性,但它并不孤单。每个 Unix 都有一些特性。对我来说,重要的问题是 Linux 支持所有标准的 Unix 命令和 shell 功能。
当我刚开始在兰乔教书时,我最大的问题是学生们在每周一次三小时的课程之外无法访问 Unix。学校有一个计算机实验室,但那里的任何系统都无法访问 Unix。在决定使用 Linux 之前,我考虑了几种替代方案。有一些软件包允许您在 MS-DOS 下运行 Unix 实用程序。我决定不使用这些,因为出现的问题实际上不是 Unix 问题,例如 MS-DOS 不支持大写和小写文件名或 Unix 权限。还有另一种 Unix 版本可以从软盘加载,但该公司已不再营业。免费版本的 SCO 在当时不可用,而且由于它只是一个 2 用户版本,因此必须在每个工作站上安装,这在实验室环境中很困难。
我也考虑过 freeBSD。但是,我最终选择在我的课堂上使用 Linux,原因如下
Linux 的行为类似于标准的 Unix 版本,出现的问题是真正的 Unix 问题(而不是 MS-DOS 问题)。
Linux 有大量的文档和 HOWTO,允许我根据需要自定义软件包。
Linux 许可允许我免费向学生提供该软件。
Linux 不断发展,支持可用的新硬件。
互联网 ISP 使用 Linux 作为电子邮件和/或域名服务器。
Linux 在技术书店中,在 Unix 和 Internet 类别下都有很强的代表性。
有许多不同的 Linux 发行版,促进了健康的竞争并增加了价值。
以上所有内容都表明 Linux 是 Unix 的一个蓬勃发展的变体,它本身就值得研究,也是一个有用的教学工具。
另一方面,我也警告我的学生,Linux 尚未被所有雇主完全接受为商业级别的 Unix。我也在我的课堂上使用免费的 SCO Unix,以便学生可以并排看到 Unix 的变体,这样他们就可以在简历中列出 SCO Unix 以及 Linux。
为了我的学生,我创建了一个 Linux 发行版,我称之为基于软盘的 Linux。它完全从软盘运行,从不访问硬盘,但它支持所有标准的 Unix 命令和 man 页面。它还可以使用 TELNET 和 FTP 访问教室中运行的 Linux 服务器,并且可以打印到教室和计算机实验室中的网络打印机。当然,这比从硬盘运行要慢,但它在我的环境中提供了许多优势。我的学生通常是计算机新手。我需要一个万无一失的环境,让他们可以自由地犯错。因此,我排除了任何需要他们将软件加载到硬盘上的发行版,即使是 UMSDOS 文件系统。我希望我的学生能够在家里、工作场所或学校计算机实验室使用 Unix,因为我认为亲手访问 Unix 对于学习 Unix 至关重要。与此同时,我不能冒险让他们犯的错误可能会更改或损坏他们的家用计算机、工作计算机或实验室计算机。

我的学生可以在任何具有 8MB RAM 和 3.5 英寸软盘驱动器的 PC 上运行基于软盘的 Linux。软盘在使用时受到写保护,因此不会被损坏。Linux 内核已重建,因此它没有 IDE 或 SCSI 硬盘的驱动程序,以确保学生无法更改硬盘。起初,我从 Slackware 3.0 启动软盘和 RAM 磁盘开始,但我发现这些不是 ELF 格式,所以我无法添加一些我想要的命令。按照启动盘 HOWTO,我创建了自己的启动软盘和 3MB RAM 磁盘。加载 RAM 磁盘后,一个 rc 脚本会提示学生插入“Supplement”软盘,该软盘会将更多文件加载到内存中的根文件系统中。然后,学生挂载一个“Utils”软盘,这使他们可以访问更多 Unix 命令和 man 页面。
学生可以在教室外使用基于软盘的 Linux 完成家庭作业。在教室里,有 18 台 Windows PC、一台 Linux 服务器和一台免费的 SCO Unix 系统。学生在 Windows PC 上启动基于软盘的 Linux,然后使用 FTP 从 Linux 服务器下载新的家庭作业。他们还将完成的家庭作业上传到 Linux 服务器。他们可以打印到教室中的网络打印机。我还使用基于软盘的 Linux 的变体来调试网络问题,并使用 dd(设备到设备复制)“管道”到 rsh(远程 shell)来制作 Windows 硬盘分区的映像备份,以将数据保存在网络中的另一个系统或其磁带驱动器上。(为了做到这一点,启用了硬盘访问。)
我曾在全国范围内教授 Unix 和网络研讨会和培训课程。有一种教学技巧我在这些课程以及我的课堂上使用,并且被问及的频率最高。我称之为我的“电子黑板”。它允许我将我的工作站上显示的所有内容广播到房间内的所有 Unix 工作站。学生可以观看我输入命令、退格、进行更正以及使用命令行编辑逐步开发长的、复杂的管道序列。我没有在黑板上书写,而是使用 vi 将任何笔记放入文件中。学生可以看到我键入的笔记,以及我如何使用 vi,在课结束时,我可以打印该文件作为讲义。(这得益于我是一个快速的打字员。)
这种广播技术是可扩展的,因为我可以像广播到 200 或 500 个工作站一样轻松地广播到一个工作站。我可以使用两个简单的 Unix 命令来完成此广播,这两个命令在包括 Linux 在内的所有 Unix 版本上都可用。不需要特殊的软件。你能猜出我是怎么做的吗?答案如下。在我的工作站上,我首先运行此命令
telnet localhost | tee /ttt
这给了我一个新的 Unix 登录。我现在输入的所有内容的输出和回显都将保存在文件 /ttt 中。(如果您没有设置网络,您可以使用 cu 或呼叫以及两个串行端口之间的环回电缆来执行相同的操作。)
在每个学生工作站上,运行此命令
tail -f /ttt
tail 将运行直到中止,读取添加到文件 /ttt 的每个新击键,并将其显示在每个学生的屏幕上。现在,每个屏幕都完美地再现了我屏幕上显示的内容。我还可以通过编写脚本一次启动所有 tail<\!s>-f 命令来自动化此过程。注意:每个学生工作站都必须设置为使用与我在教学工作站上使用的 TERM 变量相同的变量,因为转义序列和图形也将被广播。
最后,我想给您留下一节我在高级正则表达式中教授的课程,该课程适用于 Linux 以及其他 Unix 版本。规则是:“要简化面向行的正则表达式,请删除无界的 或更多 通配符。” 这类似于简化数学中不必要的复杂分数。简化的表达式更易于实现且更易于理解。我发现,一旦学生理解了这条规则,他们就能更好地理解高级正则表达式。
在正则表达式中,有两种通配符我称之为“或更多”通配符,如以下两个示例所示
grep 'aa*bc' file
在 file 中搜索并显示包含一个或多个 'a' 实例,然后是 'b',然后是 'c' 的任何行。
grep -E 'abc\{10,\}' file在文件中搜索并显示包含 'a',然后是 'b',然后是 10 个或更多 'c' 实例的任何行。
这两个“或更多”通配符都是无界的,因为“或更多”通配符出现在正则表达式模式的开头或结尾。
在上面的示例 #1 中,“或更多”通配符是无界的,因此将其删除。搜索 abc 比搜索 aa*bc 更有效率且更容易理解,并且会选择相同的行。
在上面的示例 #2 中,“或更多”通配符再次是无界的,因此省略逗号。为了证明两个正则表达式模式是等效的,我们需要证明
它们确实选择了相同的行。在这种情况下,任何包含 'a' 然后 'b' 然后 10 个或更多 'c' 的行也包含 'a' 然后 'b' 然后 10 个 'c'。
它们避免了相同的行。在这种情况下,任何不包含 'a' 然后 'b' 然后 10 个或更多 'c' 的行也不包含 'a' 然后 'b' 然后 10 个 'c'。
在上面的示例 #3 中,“或更多”在两侧都是有界的,因此您不能忽略它。查找 z,然后是一个或多个 'a',然后是 'b',然后是 'c' 与查找 z,然后是 'a',然后是 'b',然后是 'c' 不同。
在上面的示例 #4 中,“或更多”在两侧都是有界的,因此您不能忽略它。$ 符号表示 10 个或更多 'c' 必须出现在行尾,这与在行尾查找正好 10 个 'c' 不同。
The sed 命令不是面向行的,因此此规则不适用。
sed s/aa*bc//g file
此命令指示 sed 删除 file 中由一个或多个 'a',然后是 'b',然后是 'c' 组成的任何段。
删除由 'a' 然后 'b' 然后 'c' 组成的任何段的命令
sed s/abc//g file
由于 sed 不是面向行的,因此不要删除无界的“或更多”通配符。
Steve “Mor” Moritsugu (mori@dtrbus.com) 是加利福尼亚州 Walnut 的 DTR Business Systems 的高级软件工程师。他也是加利福尼亚州圣安娜市兰乔圣地牙哥学院的 Unix 讲师。