# 28. In the Beginning was the Command Line

内核恐慌 · 2015-11-14

<https://lib.pan.icu/0d1dda91-4c87-47c7-8e4e-0b45f97bf535>

本期《内核恐慌》回顾了命令行与shell从电传打字机至今的演变史，指出TTY一词源于Teletype，300 bps的Acoustic Coupler传输速度今天难以想象。1971年Ken Thompson在Unix shell实现输入输出重定向和管道，1979年Bourne shell随Version 7发布并成为/bin/sh标准。节目解释了sh compatible的含义，对比了csh、ksh、bash、zsh、fish、PowerShell等shell的设计哲学与创新，强调命令行的核心优势在于工具小而专一、通过文本作为统一接口实现无限组合与自动化，而图形界面缺乏这种可组合性。最后推荐了lolcat、cowsay、fortune、tig、mtr、iperf3、tmux、tree、htop、pbcopy/pbpaste、open等实用命令行工具。

## Questions this episode answers

### Larry Wall的名言“移植一个shell比移植一个shell脚本更容易”是什么意思？

Rio 和吴涛在节目中用这句口号解释 shell 兼容性的核心矛盾：shell 脚本往往依赖特定 shell（如 bash 或 zsh）的扩展功能，而不同系统的默认 /bin/sh 只保证 POSIX 基本特性。因此，将脚本改写为通用标准远比在新系统上移植一个 shell 本身更困难，这句名言揭示了 shell 环境差异对运维和开发带来的实际挑战。

[0:38](https://lib.pan.icu/0d1dda91-4c87-47c7-8e4e-0b45f97bf535?t=38000)

### 在图形界面如此发达的今天，为什么命令行依然有强大的生命力？

吴涛和 Rio 指出，命令行将纯文本作为通用接口，使不同工具能通过管道灵活组合，每个工具专注“做好一件事”，从而形成高度可组合性和自动化能力。相比之下，图形界面缺乏统一的交互接口，难以像命令行那样随心所欲地串联多个程序完成复杂任务。

[1:49:07](https://lib.pan.icu/0d1dda91-4c87-47c7-8e4e-0b45f97bf535?t=6547000)

### 为什么有些开发者会选择用 zsh 替代 bash 作为主要的 shell？

Rio 表示，zsh 的右侧提示符（可以在终端右边显示时间、Python 虚拟环境等信息）是他的杀手级特性，并且 zsh 的 Tab 补全更强，甚至能补全远程服务器路径。吴涛补充，bash 的语法有时不一致，而 zsh 更一致，且 macOS 自带的 zsh 版本比 bash 新，不折腾就能用到现代特性。

[1:31:28](https://lib.pan.icu/0d1dda91-4c87-47c7-8e4e-0b45f97bf535?t=5488000)

### tmux 在命令行环境中的主要用途是什么？

Rio 介绍 tmux 是一款终端复用器，可以在一个窗口内分屏同时运行多个会话，避免反复建立远程连接。吴涛强调它的核心用法：断开 SSH 后，tmux 仍能保持程序继续运行，重新连接时可无缝回到之前的状态，非常适合长时间任务和结对编程。

[2:08:05](https://lib.pan.icu/0d1dda91-4c87-47c7-8e4e-0b45f97bf535?t=7685000)

## Key moments

- **[0:00] 开场白**
- **[0:38] 听众反馈**
  - [0:38] 本期口号来自 Larry Wall："It's easier to port a shell than a shell script."
  - [1:25] 听众反馈中提到的“丢丢盒”是 Dropbox 的昵称
  - [2:38] 吴涛认为很多学校不教 Git 等 Best Practices，不配称工程系
  - [2:49] 提到文章《Programmers should stop calling themselves engineers》
  - [4:00] Rio 提到理论物理学家不做实验，Sheldon 嘲笑 Leonard 的例子
  - [5:14] 吴涛认为如果不教代码管理工具、编辑器等，学校不配叫工程系
- **[15:24] 新闻**
  - [15:31] Rio 在打《福社四》(Fallout 4)
  - [16:35] 新闻：Google 的 Flutter 框架，使用 Dart 语言开发移动应用
  - [17:33] Rio 觉得 Dart 比 Java 好，“有什么语言能比 Java 还差吗？”
  - [19:08] Flutter 是 Google 亲儿子？但 Dart 一直未成功进入 Chrome
  - [20:05] Rio 说 Google 努力推的产品一般不成功，如 Google Plus 和 Wave
  - [21:22] 新闻：浮点数网站 0.30000000000000004.com，解释 0.1+0.2 问题
- **[32:12] 命令行溯源**
  - [32:12] 进入主题：命令行
  - [33:12] 童年记忆：90 年代开机进入 DOS 命令行，需敲 win 进 Windows
  - [34:22] 辐射 4 游戏中黑终端的声音启发，可用磁盘自检声作节目开头曲
  - [35:58] Rio 第一次接触 PC 是 C:>，有游戏
  - [36:38] Windows 3.2 是简体中文版，3.1 只有繁体
  - [37:24] 早期命令行文件管理器如 Total Commander，使用 CUI
- **[1:04:22] Shell 演变**
  - [1:04:22] shell 和 kernel 关系：shell 是用户与内核交互的工具
  - [1:05:35] shell 名字的迷惑：不是所有外层程序都叫 shell
  - [1:07:03] Ken Thompson 的 shell 首创输入输出重定向（> <）
  - [1:07:50] 管道符号（pipe）也是 Ken Thompson shell 首创
  - [1:08:11] 1979 年 Unix v7 搭载 Bourne Shell，作者 Stephen Bourne
  - [1:09:25] Bourne Shell 至今广泛存在，Mac、iPhone、Android 都有 /bin/sh
- **[1:23:15] 现代 Shell**
  - [1:23:15] 吴涛和 Rio 都使用 zsh 作为主 shell
  - [1:24:26] OS X 自带 bash 和 zsh，但 bash 版本旧因 GPLv3 冲突
  - [1:26:21] zsh 历史：1990 年 Paul Foster 写，名字来自导师邵中登录名 zh
  - [1:27:54] zsh 特性：命令补全列出所有可能，拼写纠正，远程路径补全
  - [1:29:16] zsh 右侧 prompt，Rio 放时间、用户名等
  - [1:30:51] oh my zsh 项目提供大量主题和插件
- **[1:44:26] 命令行之用**
  - [1:44:26] Q: 为什么用命令行？
  - [1:45:09] Rio 认为命令行简单，单任务不易分心
  - [1:47:19] 命令行工具更切中要害，如 tig 看 git 历史
  - [1:48:11] Unix 哲学：do one thing and do it well，可组合性
  - [1:49:07] 命令行工具链的可组合性，文本作为通用接口
  - [1:50:33] 图形界面缺少统一接口，难以组合
- **[1:57:27] 工具推荐**
  - [1:57:49] lolcat：彩虹色 cat 输出
  - [1:59:17] tig：git 的文本界面浏览器，显示提交历史
  - [2:01:32] cowsay 和 cowthink：牛说框
  - [2:02:17] Fortune：幸运饼干名言，配合 cowsay
  - [2:03:43] mtr：my traceroute，合并 ping 和 traceroute
  - [2:04:43] ipython 和 bpython：Python 的增强 REPL
- **[2:18:00] 尾声**
  - [2:18:09] 推荐网站 commandlinefu.com，分享命令行技巧

## Speakers

- **Rio** (host)
- **吴涛** (host)

## Topics

操作系统

## Mentioned

Bell Labs (company), DEC (company), Teletype Corporation (company), Git (product), Homebrew (product), Linux (product), Multics (product), PowerShell (product), Teletype Model (product), Unix (product), bash (product), csh (product), dash (product), fish (product), ksh (product), screen (product), sh (product), tig (product), tmux (product), zsh (product)

## Transcript

### 开场白

**Rio** [0:00]
欢迎收听 IPN Podcast， 网络旗下的 IT 技术主题娱乐节目 《 内核恐慌 》。 我们号称 "Hardcore"，但是也没有干货 ； 想听的人听 ，不想听的人就别听 。

本节目的网址是 kernelpanic.fm， 我们推荐大家使用 Podcast 客户端订阅我们的节目 。 详情请访问 ipn.li/faq。 欢迎你为本节目捐款 ， 捐款地址是 kernelpanic.fm/donate。

捐款金额随意 ， 只要是 8 的正整数倍就可以 。 捐款不会为你带来什么 ，不捐也不会让你失去什么 。

这句话怎么好像成了个密码 。 你们上期 《 IT 公论 》 里面为什么要插入一句话 ？ 非常突兀 ， 我觉得 。

Anyway， 我们的口号是 "It's easier to port a shell than a shell script from Larry Wall." 嗯 ， 对 ， 所以我们这期又有主题了 。 不过在进入主题之前 ， 我们先来做一下上一期的听众反馈 。

### 听众反馈

**Rio** [0:57]
首先是我们的热心听众 ，Chat 罗先生 ， 远在澳大利亚为我们写来的听众反馈 ， 说 ：" 二位前辈好 ， 第 27 期提到了用 QQ 发代码的问题 。"

二位似乎在疑惑什么场景需要这么做 。 一个典型的例子就是 Group Assignment， 虽然我本科不在国内 ，不了解国内院校的细节 ，不过如果不用 Git，而且没有退而求其次使用丢丢盒等同步盘的话 ， 组员共享的东西 ——

**吴涛** [1:25]
丢丢盒是什么东西 ？

**Rio** [1:28]
这是晚营教会我使用的 Dropbox 的昵称 ， 丢丢盒 。

**吴涛** [1:34]
丢丢 。

**Rio** [1:37]
组员共享代码就只有使用 QQ 这种门槛较低的方式 。 然而即使在国外， 效果 、 呃 ， 情况也不能说理想 。

我校虽然有顶级大牛 ， 本科必设就是给 GHC 添加 LMVM 后端 ，也还是有人不会用 Git。 做 Group Assignment 的时候 ， 把代码从自己的 Eclipse 拷贝到 Bitbucket 的网页编辑器 ，不经意间就三番五次覆盖掉别人的成果 。

以我一届本科生的浅见 ， 这大概与计算机课程覆盖面太广与其他学科相比稍欠系统性也有关系 。

如果以理工划分 ， 计算机是既有理又有工 ， 除了计算理论 PLT 那种非常形式化 、 呃 ， 非常形式化理论化的东西 ，也有例如 Git 这样乍一看非常的脏 ，但是考虑了很多因素的 Best Practice。

当然 ， 指望学校覆盖这么多内容也不现实 ， 毕竟这是一个非常依赖个人修行的行业 。 呃 ， 除了本节目就没有了 。

**吴涛** [2:38]
所以这让我想起今天我们后面要提到一个小插曲 ， 就是为什么说 ， 呃 ， 就是这个码农 ， 哦 ， 就是不能把码农称为软件工程师的一个原因 。

**Rio** [2:49]
对 。Programmers stop calling themselves Engineers。 这是一篇 。

**吴涛** [2:53]
就如果说你对这些工具流程都没有一个很 —— 或者说 ，其实这怎么说 ， 可能要反过来讲 ， 就是像那种理 、 叫 Computer Science 的学校 ， 它可能很多人会觉得这种工具层面的东西跟这个 Science 其实并没有什么太多的关系 ， 对吧 ？

然后他会觉得或多或少的会在这个层面上轻视这个东西 ，因为觉得 。

**Rio** [3:16]
都是脏货 。

**吴涛** [3:18]
它不是叫做非核心的东西吗 ？ 而且都是属于叫什么来着 ， 技校教的东西 ，不应该是大学教的东西 。

那其实我觉得这个就不太对 。 如果说你真的是想做工程的话 ， 你真的要做 Software Engineer 的话 ， 你很难想象一个 ， 呃 ， 什么传统建筑行业的人， 或者就建筑工程师哈 ， 你会跟他说他不会用那些什么工具 ， 比如说什么仪器啊 ， 还有那个梁 ， 那种架子 ， 什么测绘用的那些东西 ， 对吧 ？

你肯定是要学这些基本的操作的嘛 。 所以说我还记得像哪怕是学物理的话 ， 你还要学会用各种各样的这个叫什么来着 ， 呃 ， 呃 ， 游标卡尺啊 ， 或者这些更高级的一些工具 ， 对吧 ？

**Rio** [4:00]
那是高中物理吧 。 我觉得其实物理学的分野已经很明显了 ，有些理论物理学家真的是完全不做实验的 。

你看那个 TVBT 里面 ，Sheldon 不是也一直在嘲笑 Leonard 吗 ？

**吴涛** [4:11]
动手做实验 。

**Rio** [4:12]
对啊 。 就我觉得其实就是有这个理论和实践的分野的学科 ， 可能都会有这种多多少少的就是做纯理论的人会轻视需要动手做实践的人 ，因为其实有理论就够了嘛 。

但你刚才说的那个 ， 呃 ， 建筑又是完全一个比较 ， 呃 ，不一样的东西了 ，因为建筑本身就是从实践而来的 。

建筑没有什么纯理论的东西 ， 或者说有 ，但没有那么脱离现实的纯理论 。 它不会研究 ， 它不会研究真空中的纯球形建筑 ， 对吧 ？

**吴涛** [4:48]
但是以后我们造那个 Space Ship 的时候就需要考虑这个问题了 。

**Rio** [4:53]
真空中的球形建筑 ，不就是水滴吗 ？ 啊 ，不 ，不是水滴 ，是 。

**吴涛** [4:57]
Niggas、Dance Star。

**Rio** [4:59]
死星和那个伊谢尔顿要塞 。

**吴涛** [5:04]
对 。 所以我的观点其实很简单 ， 就是很多现在也很多学校也在分这个东西嘛 ， 它分这个计算机科学系和计算机工程系 ， 或者说就是软件工程系 。

所以如果你们这个里面带有工程这个 ，但是又不去对这个学生进行系统化的这种像这种代码管理工具的培训啊 ， 编辑器的培训啊 ，IDE 的使用培训啊 ， 你不去教这些 Best Practices， 我觉得你是不配去教自己是一个工程系的嘛 。

**Rio** [5:32]
对 ， 这是肯定的 。 但是如果你做纯理论的话 ， 又会觉得说学那些系统而微的工具的时间还是挺 ， 好像有点浪费 ， 我觉得 。

我 somehow 有这种印象 ， 就是有些学计算机的人他之所以不懂那些具体的工具 ， 乃至于学计算机科学的人不会修计算机 ，也是因为就是 。

**吴涛** [5:55]
它是工具嘛 。

**Rio** [5:56]
太耗时间了 ， 主要是 。

**吴涛** [5:59]
对 ， 所以我觉得就是说 ， 呃 ， 纯理论的也好 ，Theoretical 的研究也好 ， 培训也好 ，Research 也好 ， 这点完全没有问题 。

但是如果说你还是指望你的毕业生有能够在就业市场上， 起码本科哈 ， 你说这个博士研究生 ， 你说他们 ， 你不指望他们 ， 你不去管他们的就业 ，在那个职场 ， 就是做码农这个方向的就业 ，其实我觉得情有可原啊 。

但是如果说你是一个本科的一个教学目标 ， 然后你说把这些完全就踢掉不看 ， 我觉得是其实是有问题的 。

就从务实的角度来讲 ， 还是从这个对这些人的未来的就业的情况来讲 ， 我觉得这个是有欠考虑的 。

**Rio** [6:39]
没错 。

**吴涛** [6:41]
啊 ， 然后如果你真的这么干了 ， 就不要叫自己的毕业生是 Software Engineer 这种 Title 好了 。

**Rio** [6:48]
对 。

**吴涛** [6:50]
嗯 ， 下一则听众反馈啊 ， 这个 ， 呃 ， 这个他先揪了我们一个错啊 ， 上次上期我们提到那个叫做 Let's Encrypt 那个一个叫 SSL 的这么一个服务吧 ， 它的 Founder 基于 University of Michigan，是密歇根大学 ，不是密歇根州立大学啊 ， 这个应该是我说错了 。

意识最快 。 所以就美国这个学校也是挺有意思的 ， 它会有这个 Michigan State 或者 University of Michigan 这样两种比较坑的状态 。

**Rio** [7:21]
对 ， 你看武汉大学和湖北大学就是两所大学 ， 对吧 ？ 没有人搞混 。 但是为什么密歇根 。

**吴涛** [7:29]
不不 ， 这个是 ， 这个是 ， 呃 ， 如果可以比的话 ， 应该是湖北大学和湖北省立大学的区别 。

**Rio** [7:37]
嗯 ，OK。

**吴涛** [7:40]
哈哈哈 。

**Rio** [7:41]
对 ，因为没有一个城市叫做 Michigan。

**吴涛** [7:43]
对 ， 就是 。 接着念这则听众反馈啊 。 啊 ， 本来只想随手回复一下这个小小的口误 ， 反正也要发邮件 ，不多说几句感想括号废话 。

内核恐慌是我是从第一期开始听的 ， 追的热情不亚于追番和美剧 。 哇 ， 这么高的评价 ， 我真是不胜惶恐 。

呃 ， 早晨上班 ， 单位和公寓之间 Commute 很久 ， 经常在路上消化各种 Podcast 节目 。《 IT 公论 》 和 《 内核恐慌 》 真是一集不落 。

对 ， 念对了 。

有时候听到有意思的片段 ， 都是一个人戴着耳机坐在车上傻笑 。 哎呀 ， 这种随身便携还只能独享的愉悦真是迷样自豪呢 。

这位同学 ， 你这个中毒蛮深的 ， 真的不用怀疑 ，不用考虑下邻座的感受啊 。OK， 接着念哈 。 哎 ， 我是从事交互设计行业的 ， 所以对设计啦 、 产品啦 、MVP 啦相关的话题更感兴趣 ，其他偏开发的内容也能接受 。

之前是从 CS 转行过来的 ， 心里多少有点没能继续坚持走马的阳关大道不动摇的遗憾 。 不对啊 ， 你这选对方向了 ， 我觉得 。

嗯 ， 于是靠听播客了解大家都在干嘛 ， 讨论什么 。 呃 ， 维系你看我还是很积极关注技术的安全感 。

特别喜欢邀请了嘉宾的几期 ： 消极姐 、 沐瑶老师 、Rilo， 还有最近的 Elda。 呃 ， 感谢联系各位爹 ， 然后提供上门学生客户的那段笑死了 。

呃 ， 虽是不一样的领域 ，但都会对自己思考问题 、 解决问题的方式有启发 ， 对我来说已经很可贵了 。

这我还是蛮欣慰的 。 嗯 ， 接着念 。 呃 ， 李如意这个文青有时会把 《 IT 公论 》 的气氛弄成辩论会 ， 我隔着 Wi-Fi 都觉得这是要剑拔弩张的 ， 可能是我多虑了呢 。

呃 ， 这我要插话 ， 确实是多虑了 。 哈哈哈 。 相较而言 ， 内核恐慌就和谐得多 ， 果然程序员是天底下最可爱无害的神般存在 ，有进有退 ，有分寸还特自然 。

不管怎样 ， 我还是爱你们所有人， 包括很有 B 格括号就是包易的李如意 。 最后我其实我本来想说 ， 要是有靠谱弯曲男码农愿意每周末出来泡个咖啡店 、 图书馆 、 做做自己想做的 Side Project， 觉得有个设计师一起也不赖 ， 请联系我 。

不过我觉得这样被误解成 HR 的概率太大 ，而且听上去总有 ， 总是不像好人有种无耻的猥琐感 ， 于是算了吧 。

这挺好的 ， 我觉得挺好的 ， 你们这个自己组合吧 。

**Rio** [10:37]
对 ，他强调这个弯曲男码农 ， 所以这应该是个魅力 。

**吴涛** [10:40]
对 ， 为什么要一定是男码农呢 ？

**Rio** [10:42]
是个女生嘛 ， 可能 。

**吴涛** [10:44]
嗯 ， 好吧 。 呃 ， 还是说 ， 呃 ， 住内核恐慌越做越棒 ， 达到新闻联播的境界 。

**Rio** [10:53]
嘣嘣嘣嘣 。

**吴涛** [10:54]
当然是指风雨 。 哈哈哈 。 当然是指风雨无阻的任性和权威性咯 。 又没鼓励你们写固定排比句模板 ， 报喜不报忧 。

嗯 ， 我这还蛮开心的哈 ， 就其实这个节目能够给大家带来一点点这个快乐的时光哈 ， 然后觉得还有所启发 ， 这个其实对我 ， 我个人觉得是个挺高的评价 。

**Rio** [11:19]
听起来好激动 。

**吴涛** [11:20]
然后， 对 ， 然后我还是这个叫什么 ， 很纠结于这个为什么只限男码农呢 ？ 就没有女码农吗 ？ 你们这是要玩啊 。

**Rio** [11:30]
前两天我 ， 呃 ， 好像昨天我女朋友跟我说那个维密里有一个模特申了纽约大学去学编程啊 ， 然后她还成立了一个基金会 。

**吴涛** [11:40]
是那个 ，是那个 ， 呃 ， 就是黑人女孩子吗 ？

**Rio** [11:45]
我没有看啊 ， 说什么长得超正 ， 然后那个毅然解约去学编程 ， 还要每年支持 n 个女生去学编程之类的一个 。

**吴涛** [11:54]
啊 ， 我知道 ， 就是那个 ， 就是那个 。 她是哪个学校 ？ 她是做那个 LS 开发的嘛 ， 然后就是业余做一下这个维多米亚的这个秘密的模特 ， 身材超赞 ， 然后就是 ， 哇 ， 简直就是 。

**Rio** [12:09]
录完节目去看一下吧 。

**吴涛** [12:10]
码农女神好不好 ， 真是 。 哎 ， 之前那个什么知乎上也有一个 ，也有一个模特女孩子 ， 后来去学排行了吧 ， 我记得 。

然后后来还搞了一个创业项目 ，是做一个什么订阅器来着 ， 我忘了 。

**Rio** [12:27]
OK， 那找找那个链接加到 shownotes 就好了 。 那就我们只有这两期 ， 只有这两封反馈吧 ， 应该是 。 呃 ， 对 ，其实还有一个比较简短的 ， 就是有位听众给我们写信来说 ， 推荐了一篇文章叫做 《 Programmers should stop call themselves Engineers》，是来自于那个 Telegram 的 Atlantic， 呃 ，sorry， 报纸网站上的一篇文章 。

这篇文章其实我前两周也看过了 ， 就是它因为它曾经在 Hacker News 上出现 ， 然后嗯 ，其大意就是说这个工程师是一个非常高大上的 Title，其实它就是按照这篇文章的这个调子来说 ， 工程师是一个非常庄严 ， 呃 ， 一个让人可以信赖 ， 然后门槛非常高的这么一个 Title。

而嗯 ， 这些 Tech industry， 就是我们这些搞电脑的这帮人， 总是会 ， 总是希望把自己 ， 总是会使用什么 Software Engineer 这种 Title， 然后这样的 Title 实际上是在给 Engineer 抹黑 ，因为很多 Software 是非常不可靠的 。

就它原句中有一句话 ， 我记得就是 ， 嗯 ， 许多软件服务在今天其实已经成了 Infrastructure，但是它们却远远不如传统的 Infrastructure 可靠 。

比如说 ， 嗯 ， 对啊 ， 我其实我可以理解这种想 ， 它的这种说法 ， 比如说 Facebook， 对于很多人来说 Facebook， 呃 ， 或者 iMessage 已经全都是非常每天离不开的东西了 。

但是就今天明天什么时候莫名其妙 Facebook 就要 outrage 一下， 呃 ， 什么 outrage， 呃 ，outage 一下，Twitter 也是 ， 对吧 ？ 呃 ， 你很难想象在一个 ，在一个 ， 呃 ， 发达国家会一天到晚停电 ，但早就至少 Twitter 也有一阶段就是这样 。

**吴涛** [14:26]
但现在的像 Facebook 啊 ，Google 这些的 outage 基本上很少了吧 ？

**Rio** [14:30]
对 ，是相对来说是比较少 。

**吴涛** [14:32]
它也不是大面积的 。

**Rio** [14:33]
对 ，但我的意思就是从统计学的角度来看 ， 它们还是要比这个传统的 Infrastructure 要来得那么频繁一点 。

**吴涛** [14:46]
那倒不一定吧 ， 我觉得这个看你怎么去 ， 你要考虑一个叫什么量级的问题 ， 比如说你见过哪一栋楼每天有 10 亿人在同时使用它 ？

没有吧 ？

**Rio** [14:59]
好吧 。

**吴涛** [15:01]
对 ， 所以这个我觉得你如果要考虑这个可靠性的话 ， 得考虑它的这个使用频次啊 ， 还有那些问题啊 。

呃 ， 还有要像那些就建筑的豆腐渣工程也不好 ， 那些也不是工程师干出来的嘛 ， 对吧 ？

**Rio** [15:17]
说得也是 。

**吴涛** [15:17]
所以也不尽然 。

**Rio** [15:19]
好吧 ， 反正是一个论调 ， 然后大家可以去看一看这篇文章 ， 我觉得还行 ， 挺有意思 。

**吴涛** [15:24]
对 ， 哈哈哈 。OK， 下面进入我们这个新闻环节 。

### 新闻

**Rio** [15:29]
对 。

**吴涛** [15:29]
其实就两条新闻 。

**Rio** [15:31]
对 ，因为我们两个最近都没有怎么看新闻 。 你忙什么 ？ 我反正是在忙着打 Forbes 呢 。

**吴涛** [15:39]
你打什么 ？

**Rio** [15:41]
呃 ，《 福社四 》 刚出来的 。

**吴涛** [15:42]
好吧 ， 那个是一个什么设计游戏吗 ？

**Rio** [15:46]
哈哈哈 ， 设计游戏 。 是个 ， 呃 ， 反乌托邦的这大灾难之后的 RPG。

**吴涛** [15:57]
RPG。

**Rio** [15:58]
就是史诗般的 ， 史诗般的游戏 。

**吴涛** [16:00]
对 ， 就出到四了 ， 应该差不多是这样 。 不是史诗 ， 应该不会出到四 。

**Rio** [16:06]
对 ， 呃 ， 对 ， 所以我就只看了两则新闻 。

**吴涛** [16:10]
等一下， 你只打 Forbes 4， 你没有打 Legacy of the Void。

**Rio** [16:17]
呃 ， 它们是从头前出来的 ，但是迄今为止我刚刚只把那个 Legacy of the Void 的第一关玩了大概两分钟 ， 然后就 ， 然后就一直在打 Forbes 4。

**吴涛** [16:28]
好吧 ， 你这个叛徒 。

**Rio** [16:31]
哈哈哈 ，sorry。

**吴涛** [16:32]
好吧 ， 你有玩吗 ？

**Rio** [16:33]
我还没买 。

**吴涛** [16:34]
哈哈哈 。

**Rio** [16:35]
OK。

**吴涛** [16:35]
因为最近比较忙嘛 ， 然后也没空去玩游戏 。OK， 讲新闻吧 。 第一则是什么 ？ 其实这个是旧闻了 。 这个应该是 。

**Rio** [16:43]
这是两周之前的事情吧 ， 一周多之前的事情 。

**吴涛** [16:47]
不止哦 ， 我觉得这个东西我好像好几个月前就已经看到过了 。

**Rio** [16:52]
What?

**吴涛** [16:54]
I think。

**Rio** [16:55]
难道 ， 那 anyway， 反正这个东西也许是一周之前才正式有了自己的网站 ， 然后有了 FAQ 什么的 。

**吴涛** [17:02]
OK。

**Rio** [17:03]
对 ， 就是总之它是一个来自于 Google 的移动编程框架 。

**吴涛** [17:09]
嗯 ？

**Rio** [17:10]
呃 ， 名字叫做 Flutter，F-L-U-T-T-E-R。

**吴涛** [17:14]
嗯哼 。

**Rio** [17:14]
嗯 ， 它最大的特点大概就是使用 Dart language 来写 ， 可以支持你能用 Dart language 来写这个移动短语 。

**吴涛** [17:24]
所以这样做有什么好处呢 ？

**Rio** [17:30]
如果你开发 Android 的话 ，以后也许不用写 Java 了 。

**吴涛** [17:33]
但是 Dart 比 Java 好吗 ？

**Rio** [17:36]
呃 ， 我觉得还是好一些的吧 ，因为有什么语言能比 Java 还差吗 ？

**吴涛** [17:43]
呃 ，C++。

**Rio** [17:44]
PHP。

**吴涛** [17:46]
PHP。

**Rio** [17:47]
JavaScript。

**吴涛** [17:48]
哈哈哈 。

**Rio** [17:50]
对 ，但 Dart 跟 JavaScript 可能 ，Dart 可以 compile into JavaScript，但 anyway， 语言不是我们的重点 ，但我的意思是 ， 嗯 ， 它最大的卖点就是使用可以使用 Java 之外的语言来写 Android。

而且它 ， 呃 ， 它其实是本质上是一个跨平台的 ， 呃 ， 框架 。 它可以把 ， 呃 ， 写出来的程序编译成 OS 10 的 ， 呃 ，不是 ，iOS 的程序 。

**吴涛** [18:17]
嗯哼 。

**Rio** [18:17]
然后也可以在 Android 上跑 。 那 Windows Phone 我目前还没有印象 ，但应该将来可能也会支持 。

**吴涛** [18:25]
哎 ，其实说到那个 Android，其实用 Scala 也可以写开发这个 Android 应用吧 ？

**Rio** [18:32]
呃 ， 理论上是可以的 ，而且好像是有框架的吧 。

**吴涛** [18:36]
对 ， 只是说 。

**Rio** [18:37]
我反正你不关注 ， 我也更不关注 。

**吴涛** [18:39]
不是太流行好像 。

**Rio** [18:42]
对 ， 然后 Flutter 也采用了一些类似于那个 Facebook 的 ， 嗯 ， 叫什么来着 ，Reactive 的 ， 呃 ， 相似的设计模式 ， 然后可以支持你比较使用这种类似于 functional reactive 的方式来写它的界面 。

**吴涛** [19:01]
嗯哼 。 所以这个 Flutter 算什么 ？ 算是 Google 的亲儿子了 ？

**Rio** [19:08]
应该是吧 ， 看这个意思 。

**吴涛** [19:10]
但是 Dart 其实一直搞不懂 ，他们是到底是要主推这个还是怎么样 ，因为之前说是要把这个 Dart 做进 Chrome 里面嘛 ， 就直接支持这个语言了 ，但后来好像这个计划又取消了 ， 所以给人， 给外界的信心好像不是很足的样子 。

**Rio** [19:28]
对 ， 我觉得 Google 可能 ， 呃 ， 如果 Go language 是钦定的这个后端语言的话 ， 那前端或者是更比较没那么工业级别的使用的这种脚 ， 类似于脚本的更快的 ， 更易于执行的语言应该是 Dart 吧 ，但总觉得背后的推理不够 ，他没有在努力的去 PR 这件事情 。

**吴涛** [19:53]
对啊 ， 所以我觉得很可能 ，因为 Google 经常出这种觉得听起来还不错 ， 挺酷的一个项目 ， 然后它过一段时间就不推 ， 然后这个项目就又死翘翘了这种 ， 这也不是第一次了 。

**Rio** [20:05]
我觉得在 Google 这边有一个魔咒 ， 就是他们努力推的东西一般都不会成功 ， 比如说 ， 比如 Google Plus。

**吴涛** [20:12]
哈哈哈 。

**Rio** [20:13]
或者是 ， 对 ， 或者是什么 ， 那个之前胎死腹中的那个一出来 ， 哇哦 ， 所有人都惊呆了 ， 然后最后死掉的那个东西叫什么 ？

**吴涛** [20:21]
呃 ， 干嘛用的 ？

**Rio** [20:24]
号称要代替电子邮件的那个东西 ，Google Wave。

**吴涛** [20:27]
啊 ，OK。

**Rio** [20:28]
对 ，Google Wave 也是一顿狂推 ， 然后就完蛋了 。 所以他们可能也学会了闷声发大财的这个 。 不行 ， 我觉得最近这个节目里面这个哈梗太多了 ， 应该借一借 。

然后， 然后不推的东西反而会慢慢火起来 。

**吴涛** [20:45]
所以你看好这个吗 ？ 这个 Flutter。

**Rio** [20:48]
呃 ， 我也不好 ， 我现在已经没有再写过移动端的东西了 ， 所以 。

**吴涛** [20:55]
你已经放弃作为移动开发者了吗 ？

**Rio** [20:58]
没有 ， 我还是在看 Swift 相关的东西 。

**吴涛** [21:01]
OK， 你放弃 Android 开发者了 。

**Rio** [21:03]
对 。

**吴涛** [21:04]
好吧 。

**Rio** [21:05]
阵营不同嘛 ， 屁股决定脑袋 ， 所以我对它没有意见 ， 只是让大家知道一下 。

**吴涛** [21:10]
有这么一个东西是吧 ？ 然后是不是坑 ， 明年再说 ， 你们可以先跳进去试试 。

**Rio** [21:16]
是不是坑 ， 你跳了告诉我好了 。

**吴涛** [21:18]
哈哈哈 。OK， 这个不错 。

**Rio** [21:21]
对 。

**吴涛** [21:22]
然后这条新闻就是比较有意思的 ， 一个网站 ， 呃 ， 数字 0 点 。

**Rio** [21:32]
就是 0.3000000000015 个数字 0。

**吴涛** [21:35]
00000000044。 对 ， 这个理论上就是 ， 你看名字其实也大概猜来了吧 ， 这个是讲一个 floating point， 浮点数的一个网站 。

**Rio** [21:46]
对 ， 如果你遇到这个问题的话 ， 你一定会立刻明白这到底是一个什么梗 。 但如果你不知道的话 ， 欢迎你 ， 嗯 ， 就是如果你朋友手边有电脑的话 ，不妨去看一看 。

它是一个讲解浮点运算的网站 ， 就是在有些语言里面 ，有些非常坑爹的语言里面 ， 呃 ， 如果你去计算 0.1 加 0.2 的话 ， 结果将会是 0.3， 跟着 15 个 0， 然后 4。

对 ， 就是它不是一个你理想中的答案 。 然后究其原因是为什么呢 ， 就是这篇这个网站想要告诉你的 ， 它来自于一个 ， 呃 ， 这个 ， 对 ，他们工 ， 这是他们工程界的错误 ， 哈哈哈 ，他们工程界定了这么一个 IEEE 754 标准 ， 然后这个标准里面 ， 呃 ， 规定了计算机应该怎样用二进制来表达浮点数 ， 就是表达带小数点数的非整数 。

然后这个标准如果你严格去按照它实施的话 ， 那你最终就会得出 0.3，15 个 0， 然后一个 4 这种诡异的 0.1 加 0.2 的答案 。

**吴涛** [22:51]
就是一个近 ， 呃 ，0.3 的近似值而非确切值 ，因为你又没有办法在二进制的里面表示 ， 就没办法在二进制里面精确表示 0.3。

**Rio** [23:03]
对 ，在二进制里面 ，其实这是一个 general 的问题 ， 就是在你采用什么样的数制就会产生什么样的问题 。 比如说如果我们采用 11 进制的话 ， 那 ， 呃 ，11 分之 1 就是一个可以被表达出来的 。

**吴涛** [23:17]
等一下， 如果你采用 11 进制 ， 只能表达 11 分之 1 精确的吧 ？

**Rio** [23:22]
对 ， 如果你用 11 进制的话 ， 你就可以表达 11 分之 1，11 分之 2 之类的这种数字 ， 非常精确的吧 ，0.102。 但如果你用 10 进制的话 ， 那 11 分之 1 和 11 分之 2 就是一个无限循环小数 ， 对吧 ？

**吴涛** [23:34]
对对对 ， 你连 11 分之 2 你都没法表达呀 。

**Rio** [23:37]
为什么不能 ？0.2 不就是 11 分之 2 吗 ？0.1 是 10 进制的 ， 呃 ，10 进制的 0.1 是 10 分之 1 啊 。

**吴涛** [23:47]
啊 ， 我明白你 ， 我明白你的意思 。

**Rio** [23:49]
0.11 进制下的 0.1 不就是 10 进制下面的 11 分之 1 吗 ？

**吴涛** [23:55]
啊 ， 对 ， 没错没错 。

**Rio** [23:56]
不对不对 。

**吴涛** [23:57]
对对对 ， 理解了 ， 你说的是这个意思 。

**Rio** [23:58]
OK， 没错 。 然后， 对 ， 所以在二进制下面就有很多十进制的数字是没有办法表达为一个二进制下面的整数的 。

**吴涛** [24:08]
嗯哼 。

**Rio** [24:09]
就整的这个分数 ， 听着有点绕 ，但 you get the point。 就 0.1 可以表达 0.5，但是 0.6 就没办法表达了 ， 就大概这个意思 。

**吴涛** [24:22]
呃 ， 对 ， 所以在实际的一些编程语言里面怎么处理 ， 然后这个网页上就给了一个相对来说比较详细的列表 ， 会出现什么样的状况 。

**Rio** [24:32]
对 ， 然后你可以使用什么样的 ， 呃 ， 你在遇到什么样的语言的时候可能会得到什么样的结果 ，以及你怎样解决这些问题 。

比如说有些语言里面像 C# 之类的都有什么 decimal 库 ， 就是专门用来解决这个 ， 呃 ， 任意精度的十进制数的问题 。

你可能会问为什么不把这个任意十进制精度的数字做成一个默认的数字的实现 ，有些语言是这样的 ，但另外一些语言不是这样的 ，因为根据使用场景这个库可能会非常的慢 ，而有些时候你是不需要这个功能的 。

**吴涛** [25:08]
对 ， 一般是这样 ， 这个金融的系统里面要算设计在前呢 ， 都会有那种就是任意精度的十进制的 ， 呃 ， 任意精度的十进制的一个包去处理这些钱的数目 ， 对吧 ？

**Rio** [25:22]
没错 。

**吴涛** [25:23]
但是其他的一些就为了追求效率就是用这个 ， 呃 ， 浮点形来表示 ， 然后浮点形在现在的计算机上一般有两种长度嘛 ， 一种是叫做 float，是 32 位长的 ， 然后另外一种是叫做 double，是 64 位长的 。

**Rio** [25:38]
Double。

**吴涛** [25:38]
精度的话 ，double 应该有 53 位的精度 ，53 个 bit 的精度吧 ？

**Rio** [25:44]
对 。

**吴涛** [25:45]
53 个 。

**Rio** [25:46]
53 个 bit。

**吴涛** [25:46]
对 ，53 个 digit 的 ，53 个 digit 的精度应该是 。

**Rio** [25:52]
你是说小数点是后面的 ？

**吴涛** [25:54]
不管是小数点前 ，因为那个浮点数那个小数点是可以浮动的嘛 ， 它精度只是代表它有效数字那一部分 。

**Rio** [26:00]
对 。

**吴涛** [26:00]
对 ， 没错 ，是这样 。 然后 float 的话应该只有 ， 好像只有多少 ？

**Rio** [26:06]
28。

**吴涛** [26:07]
呃 ，7 还是 28 位 ？

**Rio** [26:09]
27 吧 ， 我想想一位的符号 。

**吴涛** [26:13]
不是 ， 它有 27 个 bit，但是它实际的表示成那个 ， 呃 ， 叫做 。

**Rio** [26:17]
哦 ， 对对 ， 你是说 range。

**吴涛** [26:19]
对 ， 它的那个 ， 它表达出来的那个 ，有效的数字好像只有 8 位还是 9 位 ， 就 8 个有效数字还是 9 个有效数字 ， 很小的一个数 。

**Rio** [26:27]
对对对 。

**吴涛** [26:28]
然后在实际语言中就会 ， 就这个跟编程其实会有点关系 ， 就是说如果你要做一个这个浮点数的 ， 呃 ， 加减乘除的话 ， 你要特别小心这一点 ， 特别是你用 float 这种 32 位的精度的 ，32 位这种窄的浮点数的时候 ， 很容易用的用就发现你累 ， 比如说你做一个累加对吧 ， 你加完之后发现 ， 哎 ， 这个跟你预想的这个出入怎么那么大 ， 就是因

为浮点数这个精度在作怪嘛 。 就你设想一下哈 ， 你加一个特别大的一个数字 ， 加上一个特别小的一个数字 ， 两个加起来因为精度的问题可能直接就无效了 。

但是如果说你有很多很多特别小的数字累加起来 ， 你再加到一个特别大的数字上面去 ， 你这个精度的牺牲导致的误差会 ， 它是会逐渐累积的嘛 。

**Rio** [27:16]
对 。

**吴涛** [27:16]
所以这个面是有很多坑爹的事情 。

**Rio** [27:19]
对 ， 所以有一个 rule of thumb 就是如果能够不使用浮点数的话 ， 尽量不要使用浮点数 。

**吴涛** [27:24]
哈哈哈 。

**Rio** [27:25]
这个是在早期 ， 早期学编程的时候应该学到的一点 。

**吴涛** [27:29]
刚才说除了这个解决方案 ， 除了说用一个这个叫做 decimal， 就是十进制的这个无限 ， 就是无限精度的一个库去 ， 呃 ， 表达 ， 就是一个任意精度的数字 ， 还有一个方法就是用一个叫做 rational 哈 ， 就是分数的形式或者叫 fraction。

**Rio** [27:44]
嗯 。

**吴涛** [27:45]
它这个原理就比较简单了 ， 它说我没有办法 ， 呃 ， 通过这个 。

**Rio** [27:50]
我没办法除进 ， 那我干脆不除好了 。

**吴涛** [27:52]
对 ， 直接就按分子分母 ， 大家还记得小学学那个吗 ？ 怎么去 。

**Rio** [27:56]
对 。

**吴涛** [27:56]
两个分数相乘的时候那个方法 ， 就是在程序上实现同样的原理 ， 最终得出来的结果还是一个分数 ， 就是几分之多少分之多少 ， 当然那个多少和就分子和分母都可能会比较大 ，但你可以通过消减什么公因数 ， 公约数的方法去把它尽量缩成一个 。

**Rio** [28:14]
最大公约数 。 我已经至少两次听到你在 IT 公论里面试图说什么最大公约数 。

**吴涛** [28:20]
对 ， 我每次都记不住到底是哪个是哪个 。

**Rio** [28:24]
对 ， 应该是最大公约数和 。

**吴涛** [28:27]
最小公倍数 。

**Rio** [28:28]
最小公倍数 。

**吴涛** [28:30]
差不多这意思 。 然后具体是哪个我也忘了 。

**Rio** [28:34]
哈哈哈 。

**吴涛** [28:35]
呃 ， 比较有意思的是在有些就是我们常见的语言里面 ， 它实现还有点奇怪 ， 比如说这个 ， 呃 ， 这个 ， 这个 c 可能还比较简单 ， 为什么 PHP 里面 ， 呃 ，0.1 加 0.2 出来是 0.3 呢 ？

然后发现 PHP 这门世界上最强大的语言 ， 它偷偷的把这个 0.3，15 个 0，4， 呃 ， 这么一个浮点数转化成了一个字符串 ， 然后把它变为 0.3。

**Rio** [29:04]
哈哈哈 。

**吴涛** [29:05]
太强大了 。 然后， 哎 ， 我不知道这个 mysql 里面这个是怎么做的 ， 它这个原理是什么 ， 应该还是用的这种就是折中的办法吧 ， 就是四舍五入的方法 。

**Rio** [29:16]
要看 SQL 是怎么实现的 ，因为 SQL， 呃 。

**吴涛** [29:20]
不是 ，SQL 规范肯定是没有定义这件事 。

**Rio** [29:24]
SQL 规范没有说什么 mysql 实现了 0.3。

**吴涛** [29:28]
对 。

**Rio** [29:29]
是个好问题 。

**吴涛** [29:29]
然后在 Python 里面有点意思 ，Python 里面是如果你把它打印出来 ， 它是一个 0.3， 对吧 ？

**Rio** [29:38]
对 。

**吴涛** [29:39]
但是实际上那个数值应该还是 0.30000000004 的 ， 所以会有一个算法去告诉说你要打印的这个值 ， 它是一个某一个 ， 呃 ， 更短的分数 ， 呃 ， 小数的近似值 ， 然后它会默认去把它近似值 。

这个 Python 的方法也是用跟 PHP 一样的嘛 ， 就是通过转换成字符串的形式去做这件事 。

**Rio** [30:03]
对 ， 然后在 Python 3 里面这一点被 ， 会被这一点被 ， 啊 ， 纠正 ， 就是不要做这些莫名其妙的优化 ，因为其实如果一个用户看到的值和它的实际的值不一样的话 ，是有可能出麻烦的 。

**吴涛** [30:14]
对 ， 所以在实际使用中， 比如说你们做一些什么 ， 呃 ， 举个简单例子 ， 你要做一个工业的一个什么测量 ， 它读出来的这个数值 ， 它可能是一个 ， 呃 ， 浮点数的时候 ， 它们是怎么去判断 ， 就是比如说你要判断这个值是否是 ，是否是大于或者小于某个值的时候 ，是要算上一个在合适的精度范围内吗 ？

还是怎么样 ？

**Rio** [30:39]
呃 ， 工业上面一般会有一个指定的 ， 呃 ， 精确范围 ，但不同工业不一样啊 ，但不过大部分都是小数点之后三位吧应该 。

**吴涛** [30:50]
就是你 ， 我就是说你在编程的时候 ， 你要判断两个浮点数的大小的时候 ， 你怎么办 ？

**Rio** [30:55]
呃 ，是 ， 你说要判断两个浮点数的相等于否吧 ， 还是大小不一样 。

**吴涛** [31:03]
对对对 ， 就其实 ，其实我觉得用判断两个浮点数是否相等这件事情本身就是跟你的初衷是有 ， 这个常识是有相悖的 ， 除非你特别理解这个 IEEE 754 到底怎么一回事 。

**Rio** [31:15]
对 。

**吴涛** [31:16]
对 ， 所以一般的话 。

**Rio** [31:17]
计算机的世界里面浮点数是非常极少的一个东西 ， 反正 。

**吴涛** [31:20]
对 ， 所以一般的话应该是两个数 ， 哎 ， 要判断两个数是否近 ， 呃 ， 相近应该是用 a 减 b， 然后算它的差值是否在某一个余数 。

**Rio** [31:28]
然后看其它差值是不是在一个 ， 对 ， 这有点像那个工业里面造两零件 ， 然后看两零件是不是合乎要求呢 ， 就要看它的偏差是不是在一个可接受范围之内 。

**吴涛** [31:41]
范围内的 。 嗯 ， 对 ， 这个还是蛮坑的反正 。

**Rio** [31:45]
没错 。

**吴涛** [31:46]
万恶的浮点数 。

**Rio** [31:47]
你看这就是计算机科学和计算机工程学的差别 。

**吴涛** [31:50]
工程的区别 。

**Rio** [31:51]
OK。

**吴涛** [31:54]
In theory there is no difference, in practical, 呃 ， 我想那句话怎么说来着 ？ In theory there is no difference between theory and practical, in practical there is。

**Rio** [32:04]
不是不是 ， 叫做 in theory there is no difference between theory and practice。

**吴涛** [32:09]
Practice, OK。

**Rio** [32:10]
In practice there is。

**吴涛** [32:11]
对 。

### 命令行溯源

**Rio** [32:12]
那今天的主题就是比较 in practice 的一个东西 。 嗯 ， 主题是命令行 。

**吴涛** [32:23]
嗯哼 。

**Rio** [32:24]
对 ， 这也是 ， 这是我们上期提到的吗 ？ 还是上上期提到的一个主题 ？

**吴涛** [32:28]
反正某一期你承诺过 。

**Rio** [32:29]
对 。

**吴涛** [32:30]
你就要讲 。

**Rio** [32:31]
对 ， 然后其实这个主题也的确是挺值得说的 ，因为 ， 呃 ， 尤其是对于初学者来说 ， 或者是对于 ， 呃 ， 正在朝着一条路上越走越远的人来说 ， 呃 ， 命令行是一个

， 是一个绕不开的话题 。 就基本上 。

**吴涛** [32:51]
我其实我觉得这个 ， 这个我要先问一个问题 ， 现在很多这种新 ， 就是新人们 ， 好像他们学电脑都不用 ， 都直接跳过命令行了 ， 或者很多用 Windows 的人都基本不用命令行了 。

**Rio** [33:04]
但是我觉得将来还是会 ， 早晚有一天你会撞上 。

**吴涛** [33:08]
所以你觉得他们还是会把这课给补上是吧 ？

**Rio** [33:12]
呃 ， 对 ，其实这也是一个 ， 这也是一个值得讨论的话题吧 ， 就是在我们小时候 ，在 ， 呃 ， 大家就至少在 Windows 或者是 DOS， 微软的操作系统用户的早期的童年记忆里面 ， 计算机开机是不会自动进入图形界面的 ， 同学们 ， 就是像你们这些 ， 呃 ， 饱受溺爱的 Mac 用户 ， 一开机就可以看到一个闪闪发光的大苹果 ， 然后一进去就有鼠标用 ， 这种事情在至少

90 年代的中国是不可想象的 。 呃 ， 对 ，在 Windows。

**吴涛** [33:49]
开机先选一个 BIOS screen 对吧 ？

**Rio** [33:52]
对 。

**吴涛** [33:52]
然后进到那个 C。

**Rio** [33:53]
然后你可以听到那个熟悉的磁盘自检的声音 。 啊 ， 对对 ， 我们应该把磁盘自检的声音拿来当我们的开头曲用的 ， 就像那个 。

**吴涛** [34:01]
对 ， 那个怎么形成一个开头曲 。

**Rio** [34:03]
就像那个 ， 呃 ，ATP 一样 ，他们用那个调制解调器的声音 ， 我们可以用 ， 我们可以用那个磁盘自检的声音来当开头曲 。

**吴涛** [34:14]
好吧 ， 终于找到一个符合本节目主旨的这么一个 ， 呃 ， 声音的特质了 。

**Rio** [34:22]
我是在那个辐射 4 里面 ，因为辐射 4 里面经常需要去黑一些那个 terminal， 然后那个 terminal 有个特别的声音 ， 我是听那个声音的时候想到的 。

**吴涛** [34:31]
OK。

**Rio** [34:32]
Yeah。

**吴涛** [34:32]
Agree。

**Rio** [34:33]
呃 ， 然后， 对 ， 然后我们在 90 年代的时候需要开机看到一个 BIOS 自检 ， 然后屏幕清零 ， 左上角出现一个闪烁的 C 冒号反斜杠大于号 ， 然后一个闪动的图标 。

**吴涛** [34:48]
等一下，90 年代你就看到 C 了吗 ？ 应该是 A 或者是 B 吧 。

**Rio** [34:52]
呃 ， 哎 ， 对 ，A 冒号反斜杠大于号 ， 没错 。

**吴涛** [34:58]
嗯哼 。

**Rio** [34:59]
哎 ，C 啊 ， 我没有那么 ， 没有那么 hard call 啊 ， 我觉得 ， 我小时候就在我的那个 ， 呃 。

**吴涛** [35:05]
你一来就有磁盘 ， 就有硬盘 。

**Rio** [35:07]
就我刚学习机之后的电脑 ，其实我遇到的已经大部分都是带磁盘的了 。

**吴涛** [35:13]
我想想 。

**Rio** [35:14]
对 。

**吴涛** [35:15]
你没用过那种叫做 ， 叫做无盘工作站吗 ？

**Rio** [35:19]
无盘工作站是 。

**吴涛** [35:22]
就那个时候磁盘很贵嘛 。

**Rio** [35:24]
联网了之后才有的呀 。

**吴涛** [35:26]
不 ， 就我知道 ， 就是有些那种 ，以前那种叫做什么来着 ？ 不叫 ， 叫机房吧 ， 对 ， 它不是每台电脑都有磁盘的 。

**Rio** [35:35]
我知道 ，但我的意思是我第一次接触计算机 ， 就接触 IBM PC 兼容机 ， 应该是在我爸单位的那个 ， 一个秘书室类似的这么一个地方 ， 然后那个 ， 那个电脑不仅有磁盘 ， 还有游戏在上面 ， 所以我第一次接触到 C 冒号反斜杠大于号应该是在那台电脑上 。

**吴涛** [35:55]
那你那个还 ， 运气还是蛮好的 。

**Rio** [35:58]
对 ，在此之前我只能在那个中华学记上用一个录音带的那个读取的东西 ，但是中华学记反正没有那个 ，因为就是 Apple II 嘛 ， 反正没有磁盘的概念 ， 所以就没有那个盘符的概念 。

**吴涛** [36:10]
OK。

**Rio** [36:11]
对 。

**吴涛** [36:12]
所以进到 C 之后要怎么进图形界面 ？ 还要敲个 Win 吧 ，是不是 ？

**Rio** [36:16]
对 ， 你要打 Win 回车 ， 然后才可以进 Windows。

**吴涛** [36:19]
是什么 Windows 3.1？

**Rio** [36:22]
Windows 3.2。

**吴涛** [36:22]
Windows

3.2 是简体中文版的 ，Windows 3.1 只有 。

**Rio** [36:27]
好像是 。

**吴涛** [36:28]
对 ，在世界其他地方 。

**Rio** [36:28]
最近版本特别短命 。

**吴涛** [36:30]
对 。

**Rio** [36:31]
嗯哼 。Windows 3.1 或者 Windows 3.2 是那个 Windows 95 之前世界上最流行的 Windows 版本 。

**吴涛** [36:38]
嗯哼 。

**Rio** [36:40]
对 ， 施瓦辛格演过一部电影 ， 叫什么来着 ？ 谎言与 。

**吴涛** [36:45]
真实谎言 。

**Rio** [36:46]
真实的谎言里面那个 ， 呃 ，他潜入一个反正是阿拉伯语的这么一个机构里面 ， 然后那个 Windows 的那个 3.2 的上面显示的是阿拉伯语的 Windows， 我还挺惊讶的 ， 对 ， 印象很深刻 。

所以在那个时代是开机不默认进图形界面的 ，I don't know， 所以那是一个非常 。

**吴涛** [37:07]
哎 ， 那个节点我还记得有一个 ， 就是当时就是图形界面还没有完全普及 ， 或者说有些机器太古老 ， 它跑那个图形界面会比较慢嘛 ，但是还用那个叫做命令行的文件管理软件 ， 叫什么来着 ？

什么 commander，Total Commander 吗 ？

**Rio** [37:24]
Total Commander， 对 ， 呃 ，PC Tools，Total Commander， 还有好多东西都是命令行下面的一个命令行界面 ， 就是命令叫什么 ，有一个专门名字来形容这种东西 ，CUI， 就是 Command Line User Interface， 就是它虽然不是图形界面的 ，但是它是用各种各样的符号来组成一个可以点的窗口啊 ， 呃 ， 可以像 。

**吴涛** [37:45]
你用鼠标可以用 。

**Rio** [37:47]
对 。

**吴涛** [37:48]
然后鼠标就是一个一大块字符 ， 一个字符就是那个 ， 就 ， 呃 ， 它应该是一个 80 乘以 24 个字符的一个窗口嘛 。

**Rio** [37:57]
对 。

**吴涛** [37:58]
然后鼠标就刚好占一格 ， 一个字符的位置 。

**Rio** [38:01]
对 ， 然后你挪动鼠标的时候 ， 屏幕上就有一个大黑块在挪动 。其实在好多 Linux 安装界面里面还是可以看到这个东西 。

**吴涛** [38:10]
Aperitus, 啊 。

**Rio** [38:12]
嗯 。

**吴涛** [38:13]
然后其实 AI 这个 ， 呃 ，Linux 下面的这种工具一般是基于 ， 很多是基于那个叫 Encurse.

**Rio** [38:22]
Encurse.

**吴涛** [38:22]
Encurse 吧 。

**Rio** [38:22]
对 。

**吴涛** [38:22]
Encurse 这个包来写的嘛 ， 然后还挺常 ， 就还算常用吧 ， 至少 。

**Rio** [38:27]
嗯 。

**吴涛** [38:27]
我们在节目最后会介绍一些类似这种工具哈 ， 那这里就先放一放 。

**Rio** [38:33]
对 ， 首先反正在那个时候你可能 ， 呃 ， 你打开电脑会 ， 你有一个明确的想法说今天我要干什么 ， 然后根据你要干什么你要决定说是在这个 DOS 的命令行 ， 呃 ， 命令提示符下面打入 ， 打比如说 ， 呃 ，PAL， 或者是 ， 呃 ，CNC， 还是打 Win，因为如果你要玩游戏的话 ， 你可能不需要那个图形界面的操作系统 ， 你只需要打入那个游戏的名字 ， 然后游戏就会独占整台计算

机 ， 然后把所有 。

**吴涛** [39:06]
大富翁的那个启动名是不是 Rich 啊 ， 我记得 。

**Rio** [39:09]
对对对 ， 没错 。 还有三国啊 ， 那个什么战国全运传啊之类的 ， 你就需要在那个盘符下面输入这个 。

**吴涛** [39:19]
金庸群侠传好像也是这样吧 。

**Rio** [39:21]
对 ， 金庸群侠传也是 。 就在那个时候很多人都记 。

**吴涛** [39:25]
啊 ， 先见 ， 先见 ，不要忘了这个 。

**Rio** [39:27]
刚才说了 。

**吴涛** [39:28]
对 。

**Rio** [39:28]
啊 。

**吴涛** [39:29]
然后那个 PAL 是什么来着 ？Paladin， 就是那个 ， 这个游戏的英文名很奇怪的叫做 Paladin 之类的 ， 就是十字军的那个词 ， 还是我记错了 ？

**Rio** [39:42]
为什么会这样 ？

**吴涛** [39:43]
对 ， 我也不知道 ， 我觉得很奇怪 。 然后反正在那个时代后很多人不学电脑 ， 或者说没有那么 tech savvy 的人， 乃至于很多小孩子可能打开电脑唯一会做的一件事情就是在那个命令行后面输入这个游戏的名字然后按回车 ， 这就已经算是懂电脑的表象了 。

**Rio** [40:01]
完了吧 。

**吴涛** [40:01]
对 ， 这大概就是相当于在 Windows 下面你会按开始菜单就是这种感觉 。

**Rio** [40:07]
对 。

**吴涛** [40:08]
后来 1995 年有了 Windows 95， 整个世界才进入一个就是开机默认进图形界面的时代 ， 当然苹果用户例外 ，但我们至少我们小时候都不是苹果用户 。

**Rio** [40:23]
You know。

**吴涛** [40:24]
你是吧 ， 你不是从苹果机开始起家的 。

**Rio** [40:26]
但是 。

**吴涛** [40:27]
Apple II。

**Rio** [40:28]
但是 Apple II 开机也不是进图形界面的呀 。

**吴涛** [40:31]
对 ，Apple II 还是一个 。

**Rio** [40:32]
就除非 ， 我的意思是除非你是 Macintosh 或者是你是 Apple Lisa 用户 ， 你小时候是 Apple Lisa 用户 ， 那你肯定不会跟我们是同一个阶级的人好吗 ， 所以 。

**吴涛** [40:43]
我的意思是 ， 对 ，在普通人的童年里面 ，在中国普通人的童年里面 ， 很少有人会接触到一开机就进入图形界面的电脑 。

当然这是我们那个时代 ， 现在很多人可能你 ， 我相信我们的听众里面很多人已经在 Windows 95 发布会之后出生的了 ， 所以 。

**Rio** [41:04]
啊 。

**吴涛** [41:06]
OK。

**Rio** [41:07]
Yeah。

**吴涛** [41:08]
Come on, go on。

**Rio** [41:09]
The hard code truth。

**吴涛** [41:12]
Yeah。 啊 ， 那接着讲历史吧 ， 这个命令行的历史要追根溯源其实还蛮久远的 。

**Rio** [41:19]
对 ，其实这是一个非常自然的事情 ， 就是在早期 ， 呃 ， 早到什么时候 ， 就是在 50 年代 60 年代 ， 根本世界上根本没有人想过要在 ， 要能够实时的在屏幕上画出一个图形然后你去操作它这种事情 ， 虽然那个时候电视已经问世了 。

**吴涛** [41:38]
嗯哼 。

**Rio** [41:38]
嗯 ， 等等 ， 电视是什么时候问世的 ？195 几年问世 。

**吴涛** [41:45]
对 。

**Rio** [41:45]
然后或者是 1955 年开始普及了 ，但是 1955 几年的计算机却没有采用电视来做他们的显示终端 ，而是采用一种叫做 Teletype 的东西 ， 我们现在一般翻译成电传打字机 。

嗯 ， 它顾名思义嘛 ， 就是可以用电 ， 可以远程传输数据的打字机 ， 打字机的意思就是你按一个键然后你前面有一个纸滚 ， 然后这个纸滚 ， 这个滚动的纸卷上面会显示出你打的字符 ， 然后这个电传打字机是 ， 呃 ，Teletype 就是由 Teletype 公司所制造的 ， 然后 Teletype 公司所制造的这些机器在 50 年代末 60 年代初的时候是基本上是遍布整个 ， 呃 ， 西方世界 ， 就是尤其

是美国 ， 基本上每一个 ， 呃 ， 每个大学 ， 每一个机构都会有 ，因为这个东西真的是非常非常的 ，在那个时候就像一个 ， 像什么呢 ， 像有点可以类比为今天的什么东西呢 ？

**吴涛** [42:51]
点击邮件 。

**Rio** [42:52]
其实就是有点像今天的笔记本电脑吧 ， 就是基本上可以用到的地方非常多 ， 然后， 嗯 ，有点稍微有点尊严的地方都会弄上去 。

**吴涛** [43:07]
其实你有用过这个电传打字机这种实体吗 ？

**Rio** [43:09]
我还没有老到这个地步 ， 我只在那个德意志博物馆里面见过 。

**吴涛** [43:13]
你用过 ？ 我也只是在电影或者是这个博物馆里面见过 ，其实并没有用过这个东西 。

**Rio** [43:19]
对 。

**吴涛** [43:19]
然后我印象最深刻的应该是用这个 ， 就是那个传那个叫做 stock tick， 就是股票的 ，因为在以前的那种股票交易所 ， 它可能是用这种电传打字机 ， 然后用一个很长的那个纸袋打出来那个股票的价钱嘛 ， 实时报价嘛 。

那只见过这种用例哈 ， 就是其他用例还真的蛮少见 。

**Rio** [43:40]
嗯 ， 然后在我记得我是在以前读一篇就是讲操作系统的历史文章里面说那个作者当时他还是一个中学生 ， 然后他们学编程的方法是 ， 呃 ， 先在一张纸上仔细写下自己想要写的程序 ， 好像是 Fortran 还是 Pascal 的程序 ， 然后第二天拿着这张纸去 ， 呃 ， 学校的图书馆的一间房子里面 ， 然后把自己的这个程序输入到一个打孔机上， 打孔机会 ， 呃 ， 根据你按下的

键来把一个打孔纸袋 ， 嗯 ， 打上孔 ， 然后把这些打孔 ， 打好孔的卡片放到一个 ， 呃 ， 电传打字机的输入槽里面 ， 然后这个电传打字机可以把 ， 嗯哼 ， 可以把这些打孔的 ， 嗯 ， 卡 ， 这些打了孔的卡片利用这个 ， 呃 ， 电传打字机的调制解调器连上电话 ， 然后输入到远端的一台计算机上， 然后计算机帮你输入执行你的程序 ， 然后再把这个结

果传回来 。 呃 ， 对 ， 整个过程我还是觉得读的就是觉得非常的惊悚 ，因为你会很难想象说我靠写这么一个程序 ， 比如说 print hello world，在那个时候可能是需要两天的这么一件事情 。

**吴涛** [44:59]
嗯 。

**Rio** [45:00]
对 ，而且刚才提到一个细节就是它一个电传打字机会需要跟远端的一台电脑联络 ， 对吧 ？ 呃 ，但是就有一个问题 ， 就是在

贝尔实验室 ， 嗯 ，不是贝尔实验室 ， 就电话是由贝尔公司发明的 ，是由贝尔发明的 ， 对吧 ？ 当然有些人会说它是爱迪生发明的 ，但是就如果你没有被这个中学课文骗过 ， 骗到的话 ， 那电话其实是贝尔发明的 。

然后贝尔成立了贝尔公司 ， 呃 ， 贝尔公司到 1981 年还是哪一年为止 ， 一直都是美国一个独占垄断的这么一个电话公司 ， 就是如果你在美国使用电话的话 ， 那你使用的一定是贝尔公司的服务 。

**吴涛** [45:43]
就是 90 年代的中国电信嘛 。

**Rio** [45:46]
没错 ， 就是那种感觉 。 所以我们通过读历史就知道这个电信公司永远是邪恶的 。Anyway，在 60 年代的时候贝尔公司有这么一条 ， 呃 ， 规定就是我的电话线路只能用来打电话 ， 你不能在上面传输其他电信号 。

呃 ， 这就意味着你不能说我把电话拆了 ， 然后把它连到电传打字机上， 然后让这台电传打字机和另外一台电传打字机联络 ， 那怎么办呢 ？

呃 ， 人们有这么一个方法 ， 就是用一个 ， 呃 ，有一个小盒子 ， 然后这小盒子上面有两个圆形的 ， 用这个 ， 呃 ， 皮 ， 呃 ， 人造革包起来的这么一个 ， 两个基座 ， 然后你可以把电话拿起来 ， 拨一个号 ， 然后把这个电话放在这个基座上， 这样电话的两个听筒 ， 呃 ， 一边对着一个麦克风 ， 就是 ， 呃 ， 听筒对着麦克风 ， 然后电话的听筒呢 ， 则对着那

个小盒子上面的扬声器 ， 这样小盒子可以把电传打字机的电信号转化为声音信号 ， 就是如果你用过拨号上网的话 ， 就是那种滴滴滴 ， 嘟嘟嘟 ， 那种声音 ， 然后这个信号被电话用声音信号 ， 用模拟的声音信号传到远端 ， 然后远端再把它转化为二进制信号 ，是这么一个过程 。

这也是一个非常有意思的东西 ， 然后这个东西一直使用到 ， 呃 ，70 年代初吧 ， 呃 ， 这个贝尔公司减 ， 就是去除了这个限制 ， 人们才渐渐的可以就不再用这种非常原始古老的 ， 呃 ， 用声音来传递二进制信息的 ， 呃 ， 这个东西叫什么 ？

呃 ，Acoustic Coupler， 对 ，Acoustic Coupler， 声音 。

**吴涛** [47:32]
Acoustic。

**Rio** [47:33]
Acoustic Coupler， 那叫什么呢 ？

**吴涛** [47:35]
呃

， 声音连接器 。

**Rio** [47:39]
对 ， 声音连接器 ， 对 。其实这个其实现在讲来还是蛮酷的 ， 就感觉刚好今天我看到一则 ， 呃 ， 一则新闻哈 ， 就是说现在有些这个 ，因为广告做那个追踪嘛 ，Ad Tracking 嘛 ， 它就说现在有一种很暗黑的科技 ， 就是电视的广告里面它会植入一种高频的声波 ， 就是这个人耳是听不见的 ， 然后这个高频的声波是可以被手机的麦克风捕捉到 ， 然后

它上面手机上会跑一个应用去监听麦克风 ， 听到这个声音 ， 它从而知道你是否在看哪个电视节目 。

**吴涛** [48:14]
天哪 ， 简直是 1984 了吧 。

**Rio** [48:18]
但是你想想这个原理其实就跟刚才讲的那个 Acoustic Coupler 其实是差不多的嘛 ， 就是叫声学连接嘛 ， 就是我们现在有 Wi-Fi 通过无线电的信号去传输这个信息的嘛 ， 它这个玩意是用一个声波的信号去传输这个信息的 ， 然后只是说因为为了这个传输的效果好 ， 它把这个扬声 ， 就是收发 ， 就是收发端嘛 ， 简单来讲 ， 就麦克风是一个收端 ， 然后这

个扬声器是一个发送端嘛 ， 然后它是 ，因为你这个电话机是有麦克风扬声器 ， 它可以发可以收嘛 ， 你那个 Acoustic Coupler 也是有这个扬声器和麦克风 ，也是收和发嘛 ， 两个反转对接 ，不就刚好形成了一个连通的回路了嘛 。

**吴涛** [48:58]
没错 。

**Rio** [48:59]
这听起来是蛮帅的 。

**吴涛** [49:00]
没错 ， 太帅了 。

**Rio** [49:04]
呃 。

**吴涛** [49:04]
然后后来就说那可以直接接电了 ， 就意思是说从无线变有线了呗 ， 直接插管子 ， 对吧 ， 插线 ， 就不用耗这个 。

**Rio** [49:13]
后来的这个调制解调器就可以自己去进行拨号 ， 然后直接把音频信号转化为这个 ， 直接把电信号转化为音频信号 ， 然后再 。

**吴涛** [49:23]
哎 ， 所以其实这个 Acoustic Coupler 和这个我们理解的 Modem 其实本质上是做同样的事情的 ， 对吧 ？ 只是说它们接入方式不一样而已 。

**Rio** [49:31]
Acoustic Coupler 应该是 Modem 的一个部件 ， 就是 。

**吴涛** [49:34]
对对对 ， 就是代替这个导线的那个部件嘛 。

**Rio** [49:37]
对 ， 就是后来的 Modem 可以直接通过一个分线头插在电话线上， 就是 Modem 其实本身就是电话的线路的一个分线头 。

**吴涛** [49:45]
那叫什么 ？RJ32 这个标准 ，RJ 多少 ？RJ45 是网线 ， 对吧 ？

**Rio** [49:49]
对 ，RJ45 是网线 ，RJ32 是 ， 应该是 32。

**吴涛** [49:53]
是电话线 。

**Rio** [49:53]
就是小的那个电话接头 。

**吴涛** [49:55]
哎 ， 这叫什么来着 ？ 查一下 。

**Rio** [49:57]
你查吧 。

**吴涛** [49:58]
Telephone line。

**Rio** [49:59]
水晶头 。

**吴涛** [50:05]
RJ 是叫做 Register Jack， 然后 RJ10，RJ11， 对 。

**Rio** [50:13]
RJ11 啊 ，OK。

**吴涛** [50:15]
对 ， 这个时候我们就 。

**Rio** [50:16]
那 RJ32 有这个东西吗 ？

**吴涛** [50:19]
可能没有 ， 记错了 。 有 RJ11，RJ14，RJ25， 然后对 ， 就这么一些 ， 然后 RJ45 就是我们常说的这个双脚线 ， 就是网线的标准头了 。

**Rio** [50:32]
嗯哼 。

**吴涛** [50:33]
它会宽一些 ， 应该是有多少帧来着里面 ？ 四个 ， 呃 。

**Rio** [50:37]
四个帧 。

**吴涛** [50:37]
网线是八个帧吧 ？

**Rio** [50:38]
对 ， 网线是 。

**吴涛** [50:39]
四对嘛 。

**Rio** [50:40]
对 。

**吴涛** [50:41]
然后这个应该是四个帧吧 ，RJ11， 具体的也不太懂 。 嗯 ， 哎 ，其实现在我看也有很多这个 ， 就是那个 RJ45，因为它那个线头多嘛 ， 它其实可以当电话线用的嘛 ， 然后它还可以留几个来做一个百兆的头 ， 所以很多这种写字楼啊 ， 或者是家里装修的时候 ， 它就说为了方便 ， 就不单独布这个电话线的槽 ，而是直接走一个网线就好了 。

**Rio** [51:05]
对 。

**吴涛** [51:05]
但是如果你现在要装修房子 ， 我强烈不建议这么干 。 首先第一个 ， 你不需要真的需要电话机了 ， 对吧 ？

现在都是用手机 。 第二个就是如果你那么干了之后， 你那个网线 ， 哪怕是你说什么超无雷的线 ， 它也最终也只能跑百兆的这个速度了 。

**Rio** [51:21]
我现在租房子就是 ， 我现在和女朋友租房子就是有那个 ， 每一间房子里面都有两个那个网线的接口 ， 好鸡肋 。

**吴涛** [51:31]
就一个是电话 ， 一个是走网 。

**Rio** [51:33]
没有 ， 两个都是 LAN。 就有一个在储藏室里面有一个装电话线的槽 ， 然后那个槽上面有一个 ， 等于房间有自己的一个 hub， 然后这个 hub 分了八根线 ， 到每个屋子里面有两根 。

**吴涛** [51:49]
所以其实并没有什么用 ， 就是说你还是用了 Wi-Fi 是吧 ？

**Rio** [51:52]
对 ， 没错 。

**吴涛** [51:55]
好 ， 太屌了 ， 技术 。其实像我们现在在 ， 呃 ， 我在那个装修办公室嘛 ， 然后发现一个新的办公室啊 ， 说也是要布线那些 ，其实都准备完全不走网线了 ， 都是走无线 ， 纯 Wi-Fi 网络 。

**Rio** [52:09]
嗯 。

**吴涛** [52:10]
啊 ， 扯远了 ， 就是接着说历史 。

**Rio** [52:12]
回到电传打字机啊 ， 我们一下子越过了 50 年的历史 。

**吴涛** [52:16]
好跳啊 。

**Rio** [52:17]
对 ， 总之这个电传打字机的模样 ， 呃 ， 非常的 50 年代 ， 就欢迎各位听众去点开这个 shownotes 里面的链接看一看 ， 电传打字机到底是一个什么样的 ， 一个什么样子 。

但是我们这跟这期节目有关的重点就是这个电传打字机通常只会在一行上面工作 ， 就是不管你输入还是输出 ， 你得到的结果一般都只有一行 ， 当然输出有可能有很多行 ，但输入基本上就是一行 。

**吴涛** [52:45]
一行是什么意思 ？

**Rio** [52:46]
一行就是这个电传打字机上面你最长只能输入固定字符 ， 一般是 80 个 ， 对 ， 然后， 呃 ， 如果你输到这还没完的话 ， 你要么要告诉电传打字机 ， 呃 ， 我还要输 ， 再输入一行 ， 然后你要输入一个特别的符号 ， 呃 。

**吴涛** [53:06]
所以这个时候你要 ， 你要 ， 你要按一个什么 ？

**Rio** [53:08]
按一个 ， 就相当于 backslash 的键 ，但是反正是上面那个实体键 。

**吴涛** [53:13]
OK。

**Rio** [53:13]
要不然你就得按回车了 ， 就是回车就是把这一行当前行的东西输出出去 。

**吴涛** [53:19]
但这个时候你是告诉的是电传打字机是我要输入多于一行的 ， 还是说告诉那个远端你要输入多于一行 ？

**Rio** [53:27]
是告诉电传打字机 ， 就是电传打字机会把你当前整个行 ， 就是它有一个 buffer 吧 ， 你可以理解为它会把你当前行 buffer 里面的东西 ， 呃 ， 传输出去 ，但是这个 buffer 有多长是 ，buffer 应该是要比一行的长度长的 ，但是不管怎么说它具体表现就是通常大部分情况下你只会输入一行东西 。

**吴涛** [53:50]
啊 ， 你想想那个场景还是蛮搞笑的 ， 你打打打打一个命令超过一行 ， 你还说 "Jodo mate"， 那我再打一下 。

**Rio** [53:58]
没错 ， 就是这种感觉 。 呃 ， 然后这个特征吧 ，也就造就了我们接下来 60 年的这个计算机历史里面几乎所有人， 就是至少所有需要学写程序的人都会面临的一个问题 ， 就是什么是命令行 ， 就是 command line，line 这个东西就来自于此 ， 就是因为早 C 电传打字机上就只允许你针对当前行来操作 ， 就是 。

**吴涛** [54:29]
所以不是命令行 ，是命令一行是吧 ？

**Rio** [54:32]
对 ， 就是一个命令行 。 就有时候你会好奇说为什么写程序不能是从屏幕上的任何地方开始 ， 为什么一定要是在左上角或者左下角 ， 或者然后输入一行命令 ， 然后按回车呢 ？

乃至于回车键到底是怎么来的 ， 为什么会有回车键 ，而不是一个 ， 呃 ， 这种东西 ，而不是一个什么 ， 比如说开始输入或者开始执行这样的键 ， 那其实也是从这来的 。

嗯 ， 对 ， 呃 ， 然后 Teletype 这个词对于我们一直延续到今天的影响 ， 还有一个就是 TTY， 就是我不知道你 ，但是我在开始接触 Linux 的时候经常会好奇说这个 TTY 到底是一个什么东西的缩写 ， 这很难猜出来 ， 对吧 ？

它其实是 Teletype 的缩写 ， 一直延续到今天 ， 包括你面对的这台 Mac 电脑 ， 或者是你手上的 Android， 或者是你的 iPhone，其实都有 TTY 这个东西 ， 对吧 ？

就是在

device slash TTY， 哪怕你打开你的 ITER， 上面都会显示说 last login 是 1 月 11 号 18:46， 然后 on TTY S000。

**吴涛** [55:45]
哎 ， 所以其实你要解释一下这个我们现在操作系统里面这个 device TTY 到底是它的一个作用是什么 ？

**Rio** [55:52]
呃 ，slash device slash TTY 其实是一个 ， 呃 ， 用软件模拟出来的一个电传打字机的中段 ， 就是你可以理解为 。

**吴涛** [56:02]
它其实应该叫做 ppty， 对吧 ？pseudo-Teletype。

**Rio** [56:06]
Pseudo-TTY， 对 ， 就是一个伪中段 ， 就是它不是一个真正的电传打字机的实体 ，而是你的计算机想象出来的 ， 它的 ， 它可以支配的诸多电传打字机之一 。

**吴涛** [56:21]
但它的作用是 ， 它的实际作用是什么呢 ？

**Rio** [56:23]
它的作用就是输入和输出嘛 。

**吴涛** [56:26]
呃 ， 就是说你打的键盘是通过这个 TTY 这个设备进入到 Kernel 的 ， 然后 Kernel 给你 print 回来的东西也是通过这个 TTY 设备传回来的 ？

**Rio** [56:36]
是 ， 就是你可以这么理解为 ， 你可以这么理解 ， 比如说我是一台 mainframe， 然后我有输入 standard out 和 standard error 和 standard input， 然后同时， 与此同时我有很多个 TTY， 呃 ， 我连接了很多个实体的机械的电子的电传打字机 ， 然后我现在说好 ， 我要把我的 standard in， 呃 ，standard input 连接到 TTY1 上， 那么此时 TTY1 上输入什么 ， 我就会把它接到我的 standard input 上， 然后我说我的 standard output 需要输入到 TTY4 上面 ，

那我比如说 TTY1， 呃 ， 刚才说了几 ，TTY1 告诉我说 print hello world， 然后我说 standard output 在 TTY4 上， 那么 TTY4 这台电传打字机上就会输出 hello world。

**吴涛** [57:23]
啊 。

**Rio** [57:24]
对 ， 它就相当于 ， 对 ， 就相当于一个标准的输入输出设备 ， 然后只不过是用软件来模拟 。

**吴涛** [57:31]
然后这个键盘的这个世界被操作系统的一个驱动捕捉到 ，也是转化到这个 TTY 的一个输入上面去再传给内核 。

**Rio** [57:40]
对 ， 如果你要使用这个 ， 嗯 ，terminal simulator， 就是如果你使用这个中段模拟器的话呢 ， 就是这样 。

**吴涛** [57:50]
嗯哼 。

**Rio** [57:50]
但是其他的一些东西里面不是这样 ， 比如说游戏肯定不是这样 ， 游戏就是直接扫描那个 ， 呃 ， 键盘产生的中段 ， 或者是 whatever it works，但是跟 TTY 没有关系 。

**吴涛** [58:04]
OK。

**Rio** [58:04]
对 ， 呃 ， 然后到 198 几年的时候 ，DEC， 就是 DEC 的全名叫什么来着 ？

**吴涛** [58:14]
呃 ，Digital Equipment Corporation。

**Rio** [58:16]
对 ， 数字设备公司 ， 呃 ， 研发出了这种就是 ， 呃 ， 用 21， 用音级射线显示管做成的这个所谓的单色显示器 ， 呃 ， 的 terminal， 我们才渐渐淘汰了 ， 人类才渐渐淘汰了 ， 呃 ，TTY 这种东西 ，但是 。

**吴涛** [58:38]
就是打纸 ， 砸到纸袋上的那种 TTY。

**Rio** [58:41]
终于你有了一个就相当于玻璃做的这么一个电传打字机 ， 然后上面 。

**吴涛** [58:47]
哎 ， 所以其实他们之前那个还是挺废纸的是吧 ？

**Rio** [58:50]
对 ， 相当废纸 。

**吴涛** [58:53]
宅男废纸啊 。

**Rio** [58:54]
你为什么也想到这个 ？ 我刚才也想说宅男废纸 。

**吴涛** [58:58]
不 ， 那个时代已经过去了 。

**Rio** [59:00]
对 ， 嗯 ， 对 ， 然后这个 。

**吴涛** [59:04]
这个玻璃的 TTY 其实就简单来说替代了一个打印机的作用 ， 对吧 ？

**Rio** [59:10]
没错 ， 就替代了打印机 。 输出 ， 然后输入的话 ， 呃 ， 最大的一个优点就是你终于可以改自己的输入了 ， 就早期的电传打字机你要打错一个字符你是改不了的 。

**吴涛** [59:25]
输错了怎么办 ？

**Rio** [59:26]
对 ， 这也是一个我的问题 ， 就我也不知道那个时候输错了到底是怎么办 ， 你也许有一个键允许你说啊 ， 这行废掉 ， 你回退到某一个地方 ， 然后你再重新打 。

**吴涛** [59:35]
就是那个 Ctrl+K 嘛 。

**Rio** [59:38]
呃 ， 对 ， 就是 ， 呃 ， 我相信电传打字机上应该还是有 backspace 的 ，backspace 按下去的话到底会具体做什么 ， 它不可能抹掉一个已经打好的字符 ， 对吧 ？

**吴涛** [59:51]
我觉得应该是把那行 kill 掉 ， 然后再起一行新的重新来过 。

**Rio** [59:59]
嗯 ， 那是 。

**吴涛** [1:00:00]
这是唯一合理的方式 。

**Rio** [1:00:01]
对 ，anyway， 这也不是重点 ，但最大的 ， 最大的一个要点就是这个玻璃的 terminal， 呃 ， 虽然表面上看它是可以改的 ， 然后可以多行显示的 ，但它本质上在它 ， 呃 ， 最底端它还是在模拟电传打字机和这个主机交互信息的方式 ，也就是说电传打字机连接到的主机并不知道它自己连接到的是一个屏幕还是一个电传打字机 。

对 ， 然后最广为流行的电传打字机的型号叫做 Teletype Model 33，Teletype Model 33 ASR， 然后我们熟知并且爱戴的 ， 呃 ， 账单大门先生 ，

呃 ， 就是在这台电脑上， 呃 ， 开始了他的第一次编程之旅 。 对 ， 呃 ， 然后第一台电传打字机的所使用的 ， 我们刚才提到这个 Acoustic Coupler 的速率是 300 bits per second， 各位可以想象一下这个速度啊 。

**吴涛** [1:01:13]
300 bits 除以 8， 啊 ， 我想想 ， 等一下，bits 啊 ， 除以 8 得到 byte。

**Rio** [1:01:19]
对 ， 那有两 ，300，240，3， 算一下，300 除以 8 需要 。

**吴涛** [1:01:29]
37.5 byte per second。

**Rio** [1:01:31]
37.5。

**吴涛** [1:01:32]
每秒钟可以打 30， 差不多 38 个字符的速率 。

**Rio** [1:01:37]
对 ， 就是我们今天的 shownotes 如果用这个 300 bps 的这个 ， 呃 ，modem 来传输的话 ， 大概 。

**吴涛** [1:01:47]
大概一两小时吧 。

**Rio** [1:01:48]
没错 ， 真是太不可思议了 。 嗯 ， 对 ， 这种感觉就像在那个辐射里面看那个 terminal 上一行一行还蹦字的感觉 。

**吴涛** [1:01:59]
啊 ， 对 ， 这个也是一个就是科幻片常用的一个梗 ， 就是那个字是一行一行 ， 就是一个一个字出现的嘛 ， 这个一定是从当年他们那个电传打字机那里获得灵感 ， 看着那个字一个一个慢慢冒出来 ， 觉得很有一种科技感是吧 ？

其实 。

**Rio** [1:02:17]
根本就是技术现实 。

**吴涛** [1:02:19]
对 ， 就下次 ， 就下次求这种什么 ， 这个科幻片再也不要用这种特效了 ， 那实在是太 low 了 。

**Rio** [1:02:27]
就我的第一台猫是 ， 我的第一只猫是 28.8K 的嘛 ， 应该是 ，14，28.8K 的 。

**吴涛** [1:02:35]
是 K，K 呀 。

**Rio** [1:02:36]
对 ， 然后这个 。

**吴涛** [1:02:37]
这个只有 3K。

**Rio** [1:02:38]
这一台猫是 。

**吴涛** [1:02:38]
没有 K。

**Rio** [1:02:39]
0.3K 的 ，you know， 就是这样的感觉 。 对 ， 呃 ， 上 BBS 都嫌卡 。

**吴涛** [1:02:49]
没错 ， 上 BBS， 那个时候真的是 BBS 没有什么 ， 我相信那个时候的 BBS 根本不存在 。

**Rio** [1:02:56]
还没有网络嘛 ， 还没有网络 ， 对 。

**吴涛** [1:03:00]
早期的 BBS 根本就是转信站嘛 ， 就是你在离线的状态下写好信 ， 读好信 ， 然后连线 ， 把所有需要收和发的信一次性收和发 ， 然后再离线 ， 再读你刚才收到的什么 ， 然后写你要写的 ， 这其实是离散那种状态啊 ， 像现在这种 Instant Messenger 真是不可想象的东西 。

对 ，anyway， 呃 ， 然后时光光阴荏苒 ， 我们来到了 Unix 时代 ， 呃 ，在贝尔实验室 ， 呃 ， 和 MIT 和这个通用电气里面的通用电气的实验室里面出现了一种操作系统叫做 Multics， 呃 ， 应该是 Multiple Time， 就是什么多用户分时系统这么一个东西 ， 然后它的后 。

**Rio** [1:03:50]
啊 。

**吴涛** [1:03:50]
对 ，在那个时代还是使用这个电传打字机的 ，但是到了 Unix 的时代基本上已经全都切换到了这个 ， 呃 ， 就是带显示器的 terminal， 然后在 ， 呃 ，terminal 时代呢 ， 呃 ，terminal 出现的时代 ， 呃 ， 人们延续了这个 Multics 里面的一个概念 ， 就是这个 shell 的概念 ， 然后， 嗯 ， 要不你来解释一下什么是 shell，shell 跟 kernel 的关系 ， 就我们节目叫做 Kernel Panic，但是我们这一期在讲 shell， 然后两者的关系是什么

### Shell 演变

**吴涛** [1:04:22]
。

**Rio** [1:04:22]
壳 ， 对 ，因为既然有内核 ，有核的话就会有一个壳吧 ， 壳是执行那些实际的 ， 呃 ， 程序的 ， 可以这么说吧 ， 然后 shell 其实就是给用户用于 ， 就用于用户和这个内核交互的一个工具嘛 ， 对吧 ？

**吴涛** [1:04:39]
对 ， 就有点 。

**Rio** [1:04:40]
然后 shell 的 。

**吴涛** [1:04:41]
你说 。

**Rio** [1:04:43]
呃 ， 然后 shell 的主要的功能就是什么呢 ， 就是让用户输入命令 ， 然后传给这个 kernel 去执行 ， 然后再把这个执行的结果再展示给用户嘛 ， 就通过这个 TTY 这个电传打字机接口 。

**吴涛** [1:04:59]
对 ， 呃 ， 我觉得 shell 这个名字其实最开始的时候我接触会觉得它有点迷惑性 ，因为 ， 呃 ，shell 在它的所指上面其实是专门指这个跟用户输入输出乃至于执行脚本的这个这么一个小工具 ， 然后这个工具它跑起来的时候会让你可以通过命令行来跟内核打交道 ，但实际上， 呃 ， 就如果你去专门追究它这个名字的话 ， 那 kernel 跑在这个核心层 ，但并不是所有

跑在外层的都是 shell， 对吧 ？

**Rio** [1:05:38]
对 ，因为还有那个 user space。

**吴涛** [1:05:40]
对 ， 还有其他一些程序 ， 这些程序可能不会直接跟你打交道 ，也可能会跟你打交道 ，但是它们在跟你打交道的时候并不会被称为 shell， 这是我早期比较迷惑的一件事情 ，但是 。

**Rio** [1:05:53]
所以 shell 类比于图形层的话应该是属于哪一层 ， 应该是属于这个 GUI 的那些 ， 那些 ， 这些组件那一层应该是 。

**吴涛** [1:06:04]
嗯 ， 对 ， 应该可以理解 。

**Rio** [1:06:06]
大致可以这么对应起来 。

**吴涛** [1:06:07]
对 ，但是当然这个 GUI 的 ，GUI 的层级乃至于抽象的复杂程度都要比 shell 要高得多得多 。

**Rio** [1:06:16]
嗯哼 ， 对 ， 然后这个早期的 shell 也是面向行的 ，因为 shell 的一个功用就是让你在 terminal 上可以跟这个远程机交互 ，而所有的交互都 ， 呃 ，因为早期电传打字机的影响被限制为一行一行 ， 所以在早期的 shell 里面你也是大部分时候你是通过一行来输入命令 。

呃 ，Unix 的早期作者之一就是我们上一期提到这个大名鼎鼎的 Ken Thompson，他在写 Unix 的时候 ， 呃 ，也沿用了这个 shell 的这个称呼 ，但是 Ken Thompson 所写的 shell， 嗯 ， 要比 Multics 的 shell 多了很多特征 ， 比如说一个最早期的最重要的特征之一就是所谓的 ， 嗯 ， 输入输出重定向 ， 对吧 ？

我们 ， 呃 ，不管是 DOS 用户还是 Linux 用户一定都很熟悉 ， 就如果你用命令行的话 ， 你一定会知道你可以把一个文件的内容当作某一个命令的输入传给这个命令 ， 或者把这个命令的输出转化为一个文件 ， 对吧 ？

然后这个特征是通过大于号小于号来实现的 ， 那然后这个功能在最开始的时候就是 Ken Thompson 所写的第一代的 ， 呃 ，Unix shell 的一个功能 ， 这是 1971 年的事情 ， 所以你每次在做输入输出重定向的时候 ， 你就在使用一个 1971 年就有的一个功能 ， 想想还是挺特别的 。

呃 ， 然后后期 Ken Thompson 的 shell 也多了就是 pipe 这种功能 ， 就是我们今天会 。

**吴涛** [1:07:50]
管道符 。

**Rio** [1:07:50]
对 ， 会经常说命令行最强大的功能之一就是管道符 ， 对吧 ？ 你可以把一个功能 ， 你可以把一个命令的输出重定 ， 呃 ，也是重定向 ， 对 ， 通过管道符重定向到另外一个程序的输入 ， 然后这个特征也是在 Ken Thompson 所写的 shell 里面就已经出现了 。

呃 ， 然后 1979 年的时候 ， 呃 ，Unix 的 ， 呃 ，version 7， 简称 v7， 呃 ， 发布了 ， 然后再随着 v7 重搭载的这个 shell 叫做 Bored Shell， 呃 ， 作者是应该是 Argo 语言的作者之一 ， 呃 ， 叫做 Stephen Bored。

嗯 ， 为什么这个 shell 没有被叫做 bshell 呢 ？ 就是 ， 呃 ， 它直接就延续了 Ken Thompson 所写的这个 shell 的名字 ， 叫做 sh， 然后 。

**吴涛** [1:08:44]
因为它是向后兼容的嘛 。

**Rio** [1:08:48]
Bash 也是向后兼容的 ，但可能在这个时候这个给 shell 重命名的风气还没有流行起来 ， 我觉得 ， 呃 ， 对 ， 所以直到今天这个 Bored Shell 一直也是世界上最为广泛使用的 shell 之一 ， 啊 ，因为 system v7 是一个非常成功的 Unix 版本 ， 很多后世的 Unix 变种也都是以 system v7 为原版本的 ， 呃 ， 直到今天包括你的 ， 呃 ， 包括你的你手上的 Mac， 你面前的 Mac， 你手上的 iPhone， 还有你的 Android， 全都有 /bin/sh 这个东

西 ， 这个东西是从 1979 年开始就已经存在于很多很多计算机系统里面的 。 嗯 ， 对 ， 然后， 呃 ， 从 system v7 开始 ， 呃 ， 我们有了这个 POSIX 标准 ， 然后 POSIX 标准也定义说 shell 必须存在于 /bin/sh 下面 ， 然后所有符合这个标准的 shell 也会被叫做 sh， 所以也就是说 ， 呃 ， 当某个人说这个 shell 是 sh compatible 的时候 ， 它会 ， 它所指的意思实际上就是指跟我们刚才提到这三种 shell 是互

相兼容的 ，但如果你一定要非常精确地说一个 shell 是 ， 呃 ， 符合 POSIX 的所有标准的话 ， 你应该说它是 POSIX shell。

然后在 1978 年的时候又开始了另外一个 shell 的研发工作 ， 这个作者是另外一位 ， 呃 ， 我们之前也提到过的 Billy Joy， 然后他 ，Billy Joy 写过什么呢 ？

快速问答 ，Billy Joy 写过什么 ？

**吴涛** [1:10:35]
写过什么 ？

**Rio** [1:10:35]
VI， 对 ，不是 VIM 啊 ，是 VI， 就是最早期的那个 V， 嗯 ， 呃 ， 编辑器 ， 呃 ，他还写了一个 shell 叫做 cshell， 然后 cshell 的一个卖点就是 ， 嗯 ，shell 这个东西就是我们如果不用 ， 如果你不用 cshell 的话 ， 你会感觉到 shell 的这个语法跟 c 离得很远 ，但是在 cshell 诞生的那个年代 ，Unix 基本上全都是用 c 来写的 ，Unix 不管是 ， 呃 ， 用户程序还是 Unix 本身都是用 c 来写的 ， 所以 cshell 的一个设计的理念就

是希望能够让 ， 啊 ，shell 的语法尽量接近于 c 的语法 ，但是我们在今天来看可能 cshell 的语法并不那么接近 c，但是在 80 年代你会觉得我靠 ， 这个东西真的是跟写 c 语言太接近了 ， 嗯 ，但是我 。

**吴涛** [1:11:30]
Which is a good, which was a good thing。

**Rio** [1:11:33]
但是今天我们会觉得说我靠 ， 为什么一个语言一个 shell script 是要写得跟 c 一样 ， 这不是自寻烦恼吗 ？

但是在那个时代如果你的电脑上只有 c， 你也只会 ， 你也只学过 c 的话 ， 你会觉得可以用像写 c 语言一样来写 shell script 是很爽的一件事情 ， 然后， 呃 ，cshell 的有很多非常多的创新啊 ， 比如说 history， 啊 ， 就是你现在在 ， 呃 ， 命令行下面打 history， 你会看到自己输入过的所有的命令 ，以及你比如说你打 ， 呃 ， 咋说呢 ， 哎 ， 感叹号感叹号 ， 你会重复前一条命令 ，

乃至于你打比如说什么 doll_， 会把刚才上一条命令的那个 ， 呃 ， 最后一个参数 argument 重新用过来 ， 这一切都是源自于 cshell，是 cshell 创造了这个 history 这个东西 ， 然后也是从 cshell 开始人们有了 job control， 就是你在 DOS 下面可能没有遇到过这种东西 ， 就是 ， 哎 ，DOS 早期不是多任务的吧 ？

你不可能在 DOS 下面 。

**吴涛** [1:12:41]
呃 ，不是 ， 只能那个可以把它 suspend。

**Rio** [1:12:44]
对 ，但是在 Unix 下面你从很早很早的时候就可以开始 ， 比如说你正在 ， 嗯 ， 解压缩一个什么东西 ， 然后它需要一段时间 ， 你可以按 control+z 让它进入后台 ， 然后用 bg 让它在后台继续执行 ， 然后你可以在前台做一些别的什么东西 ， 然后你可以同时进行很多这样的工作 ， 比如说我现在用 vim 那个习惯就是写到一半 ， 然后 control+z 然后去干点别的 ， 然后再 fg 把那个 vim 弄

回来 ， 对吧 ？ 然后这个功能也是在 cshell 里面被 ， 呃 ，Billy Joy 实现的 。

**吴涛** [1:13:18]
我就有点好奇刚才那个场景 ， 呃 ， 我一般是说在开一个这个 kernel 的窗口或者 tab 来实现 ， 就是用那个就放入后台这个的话真的挺少用的 。

**Rio** [1:13:30]
OK， 我还蛮常用的 。

**吴涛** [1:13:32]
但如果说你的 ， 你这个系统是一个单 ， 呃 ， 如果你是一个远程系统的话 ， 比如说 ， 然后你只能 ， 就你再开一个窗口也可以 ，但你再开个 ssh 连接可能会要等一下嘛 。

**Rio** [1:13:44]
对 ， 这个问题的解法其实就是三种 ， 一 ， 呃 ， 多任务 ， 二 ，tmux， 就是所谓的 terminal multiplexing， 就是 ， 呃 ， 终端互用 ， 你可以在一个终端里面开很多小终端的窗口 ， 这也是一个比较重要的奇技淫巧 ， 就一定要学起来 ， 然后再第三个方式就是你再建立一个连接好 ， 然后我个人是比较倾向于这个第一种 ，因为一个时间只做一件事情嘛 ， 就 。

**吴涛** [1:14:09]
会比较好一些 。

**Rio** [1:14:11]
嗯 ，OK， 这个我也养成这个习惯会比较顺畅一些 。

**吴涛** [1:14:16]
而且其实就是早期 ， 呃 ，有很多 ， 我也曾经试图把 vim 配置成一个 IE，因为什么在 vim 里面就直接执行程序啊 ， 或者是什么 。

**Rio** [1:14:26]
其实都是徒劳的 。

**吴涛** [1:14:27]
对 ， 那你为什么不直接干脆把 vim 挂起来 ， 然后在命令行下面做你该做的事情 ， 然后该回去的时候回去呢 ， 对吧 ？

**Rio** [1:14:35]
嗯哼 。

**吴涛** [1:14:36]
哎 ， 这样又这样 ， 然后回到我们的历史课 ， 这一次的历史真的要讲好久 ， 嗯 ， 刚才说 cshell，cshell 还有一些别的一些新的创新 ， 比如说 tool notation， 就是 ， 呃 ， 你在你的 home。

**Rio** [1:14:52]
进入家目录 。

**吴涛** [1:14:54]
对 ， 你的 ， 比如说你的 home， 你的目录是 /home/tdw， 然后我可以用一个波段号来代替这个目录 ， 呃 ， 诸如此类的 ， 还有什么 joining， 就是比如说你要在同一行上面运行两个程序 ， 你可以用一个分号把它们分开 ， 说运行第一个再运行第二个 ， 或者你可以用两个 & 把它们连起来 ， 就是说如果第一个成功了才运行第二个 ， 或者你可以用两个 ， 呃 ， 用一个 pipe， 啊 ， 比如说只有

第一个失败了才会运行第二个之类的 ， 这些 。

**Rio** [1:15:26]
代表 or。

**吴涛** [1:15:28]
对 ， 这些都是 ， 呃 ，在 cshell 里面发明的 ， 这个跟 c 很像嘛 ， 对吧 ？&& 和 pipe 都是来源自于 c 的 。

**Rio** [1:15:38]
对 。

**吴涛** [1:15:38]
然后到 1980 年的时候呢 ， 我们有了 kshell， 呃 ，cornshell 是在 ， 嗯 ， 这个时候应该是 ， 呃 ， 贝尔实验室在专门为 Unix 做发行 ， 然后这个时候恰逢 ， 呃 ， 所谓的 Unix Great War 是在 Unix 的史上， 历史上曾经出现过一系列的因为版权法和这个 ， 呃 ， 商业化的引发了一系列诉讼和口水仗 ， 呃 ，因此也是因此这个一片形势一片大好的 Unix 分裂了 ， 给了这些什么微软这种公司的可乘

之机 ， 呃 ，在这个时代出现了 kshell， 呃 ， 就是 cornshell， 它的作者叫做 ， 作者叫什么 Corn， 对 ， 它是 。

**Rio** [1:16:28]
David Corn。

**吴涛** [1:16:29]
David Corn，OK，以 Corn 来命名的 ， 然后 Corn 也有一些新的 ，也有一些创新 ，但是没有 cshell 那么多 ， 嗯 ，而且 kshell 从来没有流行起来 ， 只有这个 ， 呃 ，Unix 的一些官方版本还在用 ， 比如说那个时候 BSD 就专门避免使用它 ，因为这个 kshell 的源码当时是没有自然发放的 ， 呃 ， 然后当 Linux 兴起的时候 ，kshell 更是没有人理 ， 就他们直接就用了这个 Gene with Bash， 嗯 ， 对 ， 然后当这个 Linux 兴起的时候 ， 自由人基金

会也专门把 ， 呃 ，sh 重新开发了一遍 ， 可以理解为 ， 然后把它命名为 Born Again Shell， 就专门来凑 Bash 这个词 ，Bash 在英语里面是 ， 呃 ， 撕打还是什么之类的一个词 ， 我是也是在接受了 Bash 很久之后才意识到它居然是一个英语名词 ，而不是一个 ， 就是一个命令之类的 。

**Rio** [1:17:34]
来 ， 我们来看一下它的这个官方示意是什么 。

**吴涛** [1:17:38]
Bash strike hard and violently。

**Rio** [1:17:41]
对 。

**吴涛** [1:17:42]
凶狠的撕打 ， 凶狠的击打 ， 就是叫 ， 呃 ，有两个字 ， 叫暴揍 。

**Rio** [1:17:47]
暴揍 ，OK。

**吴涛** [1:17:49]
各位使用这个 。

**Rio** [1:17:50]
翻译得很好 。

**吴涛** [1:17:51]
暴揍 ， 嗯 ， 暴揍 。

**Rio** [1:17:54]
暴揍外壳 。

**吴涛** [1:17:56]
暴揍外壳 ， 暴揍外壳是我们目前计算机世界里面最常见的一个外壳 ， 就是如果你是用 ， 呃 ，OS/10 的话 ， 或者是你使用一个 Linux 的话 ， 那你很有可能是在用 ， 你是在用 Bash， 当然不一定啊 ，因为 Ubuntu 在前一阵子把 ， 呃 ， 它的默认 shell 改成了 dash， 哎 ，wait a second。

**Rio** [1:18:19]
又改回来了吧 ？

**吴涛** [1:18:19]
没有 ，是这样的 。

**Rio** [1:18:20]
不是 ， 我帮你 ，Debian。

**吴涛** [1:18:22]
对 ，Debian 把这个脚本执行的 shell 转化成了 dash，但是用户所使用的 。

**Rio** [1:18:27]
就是那个 /bin/shell 的实际是 dash 提供的 。

**吴涛** [1:18:31]
然后， 对 ，但是用户所使用的这个 login shell 还是 bash， 应该是这样 。

**Rio** [1:18:36]
对 。

**吴涛** [1:18:36]
对 ， 嗯 ，bash 集中了这个 ， 呃 ， 原有的 bshell 的 ， 然后 cshell 和 kshell 的优点 ， 这就是为什么我们刚才提到的 。

**Rio** [1:18:47]
想集各家之所长 。

**吴涛** [1:18:49]
对 ， 这就是为什么我们刚才提到的大部分功能 ， 你会说 ， 哎 ， 我的 shell 里面也有啊 ， 就是你不需要使用 cshell 才有 job control， 为什么 ？

就是因为 bash 把 job control 也挪 ， 移植过来了嘛 ， 对吧 ？

**Rio** [1:19:02]
OK。

**吴涛** [1:19:02]
呃 ，但是大部分这些 shell 在 ， 如果一个脚本 ， 你写一个 shell 脚本 ， 然后你在最前面写说 ， 呃 ，hash bump， 然后 /bin/sh 的话 ， 它们还是会默认去伪装 ， 把自己伪装成一个 shell， 然后只提供 shell 能够提供的情况 。

**Rio** [1:19:22]
对 ， 基本功能 ， 就不提供一些 ， 比如说 bash 的一些特定的语法啊这样的 。

**吴涛** [1:19:27]
对 ， 然后在这个 system5 release 4 也是 ， 就是 Unix 的历史上一个非常重要的 ， 呃 ， 版本里面又出现了一个叫做 almquist shell， 然后它的缩写就是 ash， 然后它的设计理念是说要把这个 shell 做得尽量精巧 ， 呃 ， 简单 ， 后来这个 ， 呃 ，almquist

shell 也被 ， 呃 ， 进一步 ， 呃 ， 改进 ， 就形成了 dash， 我们刚才提到的 dash 这个东西 ， 就是它是一个比较精简版的 shell， 专门拿来 ， 呃 ， 运行脚本程序吧 ， 可以这么理解 。

**Rio** [1:20:08]
那个 dash 那个 d 是 Debian 吗 ？

**吴涛** [1:20:10]
Debian ash 应该是这么来的 ， 对 。

**Rio** [1:20:13]
对 ， 我记得应该是这样的 ， 就是有前面有那个 ash 嘛 ，ash， 然后是 dash， 叫 Debian。

**吴涛** [1:20:21]
Debian 的旁边呢 ？

**Rio** [1:20:22]
Almquist shell。

**吴涛** [1:20:24]
对 ，shell。

**Rio** [1:20:24]
它也是为了凑这个 ，也是为了凑 dash 这个 。

**吴涛** [1:20:28]
Dash 是一个 ， 就是叫什么呢 ？

**Rio** [1:20:30]
呃 ， 冲 ， 快速前冲 。

**吴涛** [1:20:31]
小跑 。

**Rio** [1:20:32]
对 。

**吴涛** [1:20:33]
小跑外壳 ， 刚才我们介绍了猛击外壳 ， 然后又有小跑外壳 ， 暴揍外壳 。

**Rio** [1:20:39]
对 ， 对 ， 暴揍外壳 ， 小跑外壳 。

**吴涛** [1:20:43]
小跑外壳 。

**Rio** [1:20:44]
OK， 嗯 ， 对 ， 还有其实还有一些比较不常见 、 比较诡异的 shell， 还是要提一下可能 。

**吴涛** [1:20:51]
比如说 pssh，pro shell， 就是 ， 嗯 ， 你可以在 shell 里面使用 pro 这种奇怪的语言来完成一些普通 sh， 呃 ， 做不到的事情 ， 或者是 yash， 嗯 ， 就 yah 跟 yaml 一样 。

**Rio** [1:21:08]
It's another shell。

**吴涛** [1:21:09]
It's another shell. It's a POSIC component, command line shell, written by Watanabe Yuki, 一个日本人， 然后他的实现的初衷是教大家用 c 语言来写一个 shell， 本来是一个教学项目 ，但是后来又被 ， 嗯 ， 呃 ， 后来又重新改写了 ， 呃 ， 目的是要成为最 POSIC 兼容的一个 shell， 世界上最 POSIC compliant shell in the world。

**Rio** [1:21:36]
都不知道这到底是好事还是坏事 。

**吴涛** [1:21:38]
What's the point？ 所以这就是为什么没有人用 yash 的原因 。

**Rio** [1:21:43]
嗯哼 。

**吴涛** [1:21:44]
对 ， 刚才提到一个重要概念就是 sh compatible， 就是你会说 。

**Rio** [1:21:51]
兼容 shell。

**吴涛** [1:21:52]
对 ， 你会说 。

**Rio** [1:21:53]
就是这个 shell 是特指 ，不是 ， 不是一泛指的一个 shell，是特指最开始那个 ， 那个最早版本那个 shell。

**吴涛** [1:22:00]
没错 。

**Rio** [1:22:01]
就兼容那个是什么意思 ？

**吴涛** [1:22:03]
对 ， 这也是我们推荐 ，在这我们要推荐这个 stack exchange 的 Unix 的板块上面的一个答案 ， 写得非常好 ， 然后这个答案里面还顺带地介绍了在不同系统里面这个 bin sh 所指向的东西是什么 ， 比如说它说在 ， 呃 ，Soloris 10 里面 ， 可能这个 bin sh 就是默认的 original born shell， 然后你可能在这个 ， 呃 ，Linux 里面呢 ， 可能会是 genio bash， 然后你在 OpenBSD 里面可能会所使用的是一个 ksh 93， 呃 ，with POSIC extensions， 就 whatever it means。

这个答案也是推荐大家读一读 。

**Rio** [1:22:49]
嗯 。

**吴涛** [1:22:49]
呼 ， 好了 ， 大概历史就讲到这儿 ， 然后， 嗯 。

**Rio** [1:22:54]
你讲现状了吗 ？

**吴涛** [1:22:55]
呃 ， 时光机械快进到 2010 年， 呃 ， 或者说 21 世纪的第一个十年已经过去了 ， 我们还是在使用 shell， 只不过今天 ， 嗯 ， 我不知道 Rio 你 ，但是我所使用的 shell 是一个叫做 zshell 的东西 。

### 现代 Shell

**Rio** [1:23:15]
我也是 。

**吴涛** [1:23:17]
OK， 我这里可能要说一下刚才提的各种 ， 刚才提了各种各样的乱七八糟的 shell 有好几种 ，但其实经过这么多年， 这个系统 。

**Rio** [1:23:26]
大浪淘沙 。

**吴涛** [1:23:28]
对 ， 现在剩下来的也就那么几个了 ， 呃 ， 一个是绝大多数的 Linux 发行版和这个像 OS/10 也是默认使用的这个 bash， 然后， 呃 ，有一小撮这个 shell 死忠粉在坚持用的一个 z， 呃 ，z， 这怎么念 ，zesh 嘛 。

**Rio** [1:23:46]
Zesh， 对 。

**吴涛** [1:23:47]
Zesh，OK， 还有就是在一些精简系统上或者是嵌入式系统上， 像这个 ， 像一个 BizzyBox 里面自带的那个 ， 啊 ， 应该是 ， 那个应该是 ash。

**Rio** [1:23:58]
对 ， 那个是 ash， 就是在比较简 ， 简普通的 ， 或者说功能比较低下的这个不需要经常交互的操作系统里面 ， 啊 ， 基本上就提供一个 ash 就够了 。

**吴涛** [1:24:07]
对 ， 就复杂度比较 ， 那个的复杂度也比较低嘛 ， 适合在那种资源比较有限的系统上实现 。

**Rio** [1:24:14]
对 。

**吴涛** [1:24:14]
啊 ， 先说这个 OS/10 吧 ，因为我们这个常用的主机都是这个哈 ，OS/10 现在的版本里面起码是 ，是自带两个 shell 的 ， 呃 ， 一个是 bash， 一个是这个 zesh。

**Rio** [1:24:26]
对 。

**吴涛** [1:24:26]
呃 ，有一个什么问题呢 ？ 因为 bash 从 4.0 开始 ， 对 ，OS/10 自带的版本 ，bash 的版本特别老 ， 原因是因为 bash 4.0 开始他们切换到 GPL v3 吧 ， 应该是的这个 ， 这个授权协议 ， 然后这个跟 OS/10 这个商业不开源产品是有冲突的 ， 所以他们只得 ， 就是 OS/10 搭载的这个 bash 可能永远只能停留在 3.0， 就是大版本号是 3 的这个版本系列 ， 没有办法再 ， 呃 ， 进步到这个 4 了 。

**Rio** [1:24:59]
对 。

**吴涛** [1:25:00]
但是 ， 呃 ，OS/10 还自带了一个 zesh 嘛 ，zesh 是用的应该是 BSD 协议吧 ？

**Rio** [1:25:06]
Zesh 是 BSD 协议吧 ？

**吴涛** [1:25:08]
啊 ， 确认一下， 确认一下， 我记得是 BSD 协议 。

啊 ， 对 ，不 ，zesh 是 MIT 协议的 ，而且类 MIT 协议的 ， 就是它更这个灵活一些嘛 ， 啊 ， 所以就 OS/10 还是可以就是继续搭载它最新版本 ， 就基本上 OS/10 搭载的最新版本都离搭载的版本离最新版本基本上就只差一两个小版本号 。

**Rio** [1:25:36]
嗯 ， 挺好的 。

**吴涛** [1:25:37]
而且 zesh 也更新不是那么勤吧 ， 所以还好 。

**Rio** [1:25:41]
对 ， 最新一版的 zesh 是 5.1， 嗯 ，2015 年 8 月 30 日， 两个月前吧 ， 所以就还好 。 然后如果你还是坚持要用 bash 的话呢 ， 基本上非常推荐你的一点是 。

**吴涛** [1:25:54]
可以 Homebrew 再装 。

**Rio** [1:25:55]
赶紧用 Homebrew 装一个新版的 bash， 就如果你是一个初学者的话 ， 然后你可能暂时说我要保守一点 ， 先从 ， 呃 ， 一个源流比较古早的东西开入手的话呢 ，因为我相信大部分的 Linux 的这个教程上也会用 bash 作为主要的教学工具 ， 那你可以 ， 嗯 。

**吴涛** [1:26:15]
对 ，因为默认是那个嘛 。

**Rio** [1:26:17]
所以最好是先升级 。

**吴涛** [1:26:18]
所以 zesh 的来历是怎么样子 ？

**Rio** [1:26:21]
呃 ，zesh 是 1990 年时， 呃 ，1990 年的时候 ， 呃 ， 一个叫做 Paul Foster， 嗯 ，Foster，Foster 是那个 ， 嗯 。

**吴涛** [1:26:33]
你为什么要笑 ？

**Rio** [1:26:35]
Hero of the Storm 里面一个那个骑狮鹫的哥们儿 ，他是在魔兽世界里面 ， 应该是在 ， 呃 ，Hinterland， 呃 ， 辛特兰的那个狮鹫城堡里面的大 ， 呃 ， 主管 ， 叫做 Foster。

**吴涛** [1:26:49]
OK。

**Rio** [1:26:49]
Paul Foster 写了 ， 脑中想 ， 脑中浮现出了一个矮人骑在狮鹫上打电脑的场景 ， 然后他在 1990 年的时候读普林斯顿 ， 呃 ，他是一个学生 ，他是一个学生 ， 然后他的导师叫做邵中， 呃 ， 一个华人， 是一个华人， 然后邵中的 ， 呃 ， 登录名叫做 zh， 中邵嘛 ， 对吧 ， 就是先名后姓 ， 然后他觉得这个名字很屌 ， 就用 zhell 来当做自己写的这个 shell 的名字 ，zh 来当做自己写的这个 shell 的

名字 ， 然后呢 ，但是 zhell 和 cshell 也是押韵的 ， 对吧 ， 对 ， 嗯 ，是这么来的 。 然后他出于某种原因把它做得非常的复杂又强大 ， 我觉得肯定是 ， 就觉得已经到了 90 年代的吧 ， 我们应该给这个古老的 。

**吴涛** [1:27:46]
与时俱进 。

**Rio** [1:27:47]
与时俱进 ， 所以做了非常非常多的优化 ， 比如说 ， 呃 ， 它提供了

extensive 的这个 ， 呃 ， 输入提示 ， 就是你在输入一个命令的话 ， 你在 bash 上面按 tab 你可能只会得到 ， 呃 ，tab 的 ， 就是 OK，在 bash 下面输入一个命令一半按 tab， 它会补全到什么地方为止 ， 补全到它能够 ， 呃 。

**吴涛** [1:28:18]
第一个字符吧 ， 就是有奇异的第一个字符开始 。

**Rio** [1:28:21]
会补全到第一个奇异为止 ， 然后 zshell 则会列出所有可能的命令 ，在你那个当前行下面列出所有可能的命令 ， 然后， 呃 ，zshell 还会就像那个 Google 一样会问你说 ， 呃 ， 如果你输入错了一个命令的话 ， 它会问你说你是不是想要执行另外一个命令 ，有时候这个挺讨厌的 ，但是 。

**吴涛** [1:28:43]
就还带这个 autocorrection。

**Rio** [1:28:44]
Spelling correction 功能 ， 当然我们现在都用 fuck 了 ， 如果你 ， 我们待会会提到 fuck 这个东西 ， 嗯 ， 然后它还可以 ， 还可以做一些比较神的事情 ， 比如说你要 scp 到一个远端的服务器上 ，在 ， 呃 ，bash 里面你必须记住远端的服务器的命令 ， 那个路径是什么 。

**吴涛** [1:29:05]
路径 。

**Rio** [1:29:06]
但是在 zshell 里面你只需要不停地按 tab， 它会帮你补全远程服务器上的路径 ， 这也是很屌 ， 很实用又很屌的一个功能 。

**吴涛** [1:29:14]
非常的黑魔法 。

**Rio** [1:29:16]
另外就是我个人最喜欢的一点就是它可以在屏幕的右侧显示一个 promote，在右侧有一个提示符 ， 这个还 。

**吴涛** [1:29:26]
对 ， 标准状态下一般都只有在左侧提示嘛 ，因为那个 ， 那个字符串的这个 ， 就补齐的方式是这样子 ， 然后如果你要在右端的时候你要做一些额外的事情 ， 要 redraw 啊之类的 ， 对吧 。

**Rio** [1:29:39]
对 ， 这个还 ， 就有时候那么有那些不那么重要的信息你放在右边还是比较好的 ， 比如说我现在在右边放当前的时间 ， 呃 ， 用户名 ， 主机 ， 然后是那个 Python virtual environment 的名称 ， 啊 ， 然后左边就只放目录和那个一个大于号的提示符 ， 我觉得还蛮方便 。

**吴涛** [1:30:04]
呃 ， 所以这里其实要说一点就是说刚才讲的那个 zshell 的大部分这种高级特性哈 ，其实在后来的这个新版本的 bash 里面也通过各种各种各样的方式能够逐渐实现了 。

**Rio** [1:30:17]
对 。

**吴涛** [1:30:17]
啊 ， 所以在就是 feature com， 就是什么呢 ， 就是在特性的完成度上， 现代版本的 zesh 和现代版本的 bash 是相差不大的 。

**Rio** [1:30:26]
对 ，但是在 90 年代 zshell 的很多特性是现代的 ， 呃 ，是那个时候的 bash 不能不可想象 。

这就是为什么从 90 年代开始有了一大堆这个 zesh 拥趸 ， 然后一直到今天在大概在 2010 年前后出现了一个叫做 oh my zesh 的项目 ， 啊 ， 是一群 。

**吴涛** [1:30:51]
这是一个由社区维护的 zesh 的配置和插件的一个集合 。

**Rio** [1:30:57]
对 ， 就是如果你去装一个 oh my zesh 的话 ， 你可以很多很多东西就只需要改一个小小的配置文件 ， 里面的一行就可以用到了 。

**吴涛** [1:31:05]
你就可以有个很帅很酷的这么一个就是命令行的提示符 。

**Rio** [1:31:10]
对 ， 比如说它里面提供了几百种那个主题 ， 随便改一改你会觉得你会就会让这个不明就里的人看到我靠你在搞什么 ， 这是 ， 这是什么东西 ， 看起来好酷的 ， 当然 。

**吴涛** [1:31:24]
所以我有一个问题问你啊 ， 就是为什么你要从 bash 切换到 zesh。

**Rio** [1:31:28]
嗯 ，其实我 ，其实我犹豫过很久 ， 就是我这个 ， 呃 ，在两者之间反复跳跃了很多次 ， 嗯 。

**吴涛** [1:31:39]
OK，但是你的你最终要去做这个选择的原因是什么 ？

**Rio** [1:31:44]
呃 ， 最终选择的原因还是因为它的新特性太多了 ， 啊 ， 或者说对于我来说它的 killer feature 就是右边的这个 promote。

**吴涛** [1:31:55]
嗯 ， 对 ， 啊 ， 这个好像在 bash 里面还 ， 现在为止都还比较难实现 。

**Rio** [1:31:58]
对 ，在 bash 里面也不可能做到这一点了 ， 嗯

，其他的其实也没什么 ，因为我现在的特状况其实是我在办公室会用 bash，在公司会用 bash， 然后回到家用 zesh， 呃 ，在 。

**吴涛** [1:32:15]
这两个的语法在大部分情况下是兼容的 。

**Rio** [1:32:18]
在 99% 情况下你是感觉不到差别的 ， 只是有时候你在 zesh 下面会觉得非常方便 ， 比如说刚才提到这个命令的问题 ， 你在 bash 下面你可能要 tab 很多次 ， 然后才能找到自己需要找的那个 ，但是在 zesh 下面你可能 tab 一次 ， 然后看一看你就知道你要要什么 ，但是除此之外其实 zesh 的带来的改进并没有太多 。

应该这么说 ，在公司里面我基本不会 ， 呃 ， 觉得这里如果我是在用 zesh 就好了 ， 呃 ， 这就是为什么后来我曾经很多次切换回 bash 在自己的电脑上面 ，因为总觉得 zesh 是一个 ， 呃 ，you know， 就是 no standout 的东西 ， 就要加引号 zesh 当然也非常常见 ，但是没有那么 ， 没有像 bash 那么就是到处都有 ， 对吧 ， 那我为什么要依赖于这种 ， 呃 ，其实没有那么多便利的东西呢 ，但后来

还是觉得我靠 ， 能方便一点方便一点何必呢 。

**吴涛** [1:33:18]
就我 ， 我切换 ， 从 bash 切换到 zesh 的原因比较简单 ， 就是我当时做了一个 bash 的一个那个 promote 一个小脚本吧 ， 就是自定义这个 ， 就是自己定制化这个 bash 的那个提示符嘛 。

**Rio** [1:33:34]
你要实现什么 ？

**吴涛** [1:33:35]
然后发现这个 bash 的 ， 就是那个 bash power line 在那个 GitHub 上应该是最被星标的最多的一个 repository 吧 ， 就可以实现比如说 ， 呃 ，以一种看起来还挺帅的方式显示 ， 比如说你如果你这个目录是有 git 的话 ， 它会显示那个 git 的这个 branch 的名字 ， 它会显示说你有多少个 commit， 你有多少个 commit 就是 ahead 或者是 behind 远端 ， 然后它可以显示根据你上一条命令的执行的结果是正常

还是异常 ， 它会显示是绿色或者是红色这样一些比较花巧的功能吧 。 然后在做的过程中就发现其实那个 bash 的那些语法其实比较坑爹的 ， 就很 ， 就比较首先不是太一致 ， 然后也不太好记 ， 每次都要去折腾半天到底怎么去写 ， 去查半天到底怎么去写那个 ， 就是它语法比较 inconsistent。

**Rio** [1:34:30]
没错 。

**吴涛** [1:34:31]
然后 zesh 的那个就会好很多 ， 所以我最后就切到 zesh 上面 。 当然还有一个很重要的原因就是刚才讲的那个 OS/10 自带的 zesh 版本比较新嘛 。

**Rio** [1:34:41]
没错 。

**吴涛** [1:34:41]
然后我又是 ， 我现在遵循的一个哲学就是能不折腾就不折腾 ， 我不想再 Homebrew 再装一遍 bash 的 ， 然后再踢掉这样 。

**Rio** [1:34:50]
对 ， 没错 ， 对 ，其实我刚才想说的也是 ， 就是 zshell 有很多它设立之初想要达成的目的之一就是 ， 嗯 ， 用 zshell 写的 shell script， 呃 ， 或者说用使用了 zshell 的扩展 ， 呃 ，而不是纯粹的 shell sh compatible 的 shell script， 应该要比 bash 写得更 ， 呃 ， 易读更易写 ，而且更优雅一点 ， 应该可以 ， 应该应该使用优雅这个词在这 ，但是很遗憾这一点并没有铺开来 ， 就是这世界上大部分的 shell script 还是要

么是 shell， 要么是 bash， 还是很少很少有人在用写 zsh 的 shell script， 可能要比 zesh。

**吴涛** [1:35:41]
其实如果写 script 的话 ，其实还是用那个最基经典的那个 shell 的语法会通用性会强一点 。

**Rio** [1:35:48]
对 ，但是 ， 呃 ， 很多人会觉得说比如说 ， 呃 ，bash 的一些扩展 ， 比如说那个双 ， 双的双方括号 。

**吴涛** [1:35:57]
方括号 。

**Rio** [1:35:58]
要比那个单括号要能够表达语义实现功能多一些 ， 对吧 ， 所以很多人会选择用 shell， 呃 ， 用 bash 来写 shell script，但是这个数目还是要远远远远多于 ， 呃 ， 用 zesh 来写 ， 这一点还是挺遗憾的我觉得 。

**吴涛** [1:36:16]
那倒是 ， 呃 ，其实除了这些这些比较正统的这个 shell 之外 ，也有一些比较新的尝试哈 ， 最近几年出现的 ， 就是说为什么有那么多的历史包袱 ， 假设我们不考虑向后兼容性的话 。

**Rio** [1:36:29]
对 ， 如果抛开 post-sh compatibility 这个历史包袱的话 ， 那现今天的 shell 真是可以各种各样 。

**吴涛** [1:36:37]
对 ，其实其中比较著名的就是这个叫做 fish 的吧 。

**Rio** [1:36:40]
对 。

**吴涛** [1:36:40]
这个鱼 ， 鱼壳 。

**Rio** [1:36:42]
算是用的最多的一个 ， 呃 。

**吴涛** [1:36:45]
最著名的 。

**Rio** [1:36:46]
Shell 不兼容 ，sh 不兼容的 shell。

**吴涛** [1:36:49]
对对对 。

**Rio** [1:36:50]
所以你有日常在用吗 ？

**吴涛** [1:36:53]
呃 ， 我有一段时间还把它用当做主力 shell 来用 ， 它确实挺方便的 ， 它很多 ， 很多叫做 modern feature 嘛 ， 很多现代的特性 ， 比如说就是有这个语法高亮的命令行 。

**Rio** [1:37:06]
对 ， 你会这个输入的哈 。

**吴涛** [1:37:08]
有时候你会产生一种我在用一个 IDE 完了的这种错觉 ， 就是比如说你打一个 ， 你打个 ls， 然后它会把 ls 所能显示的所有参数 ， 所能使用的所有参数显示在你当前行的下面 。

**Rio** [1:37:21]
对 。

**吴涛** [1:37:22]
嗯 ， 然后它就是还有一些像那个自动补齐的下拉列表啊 ， 还有各种各样的这种一些很好的特性 ， 甚至还有一个 ， 它好像是一个网页版本的什么东西来着我记得 。

**Rio** [1:37:33]
它的那个主题是可以通过 CSS 还是什么的一个东西来

配置 。

**吴涛** [1:37:39]
啊 ， 对对对 ， 它的配色也是这个很 ， 哎 ， 说到配色要讲 ， 要讲那个 256 色那些 ，其实在 shell 里面打出有颜色的字这件事来说还是挺麻烦的一件事 。

**Rio** [1:37:50]
对 ，有时候你可能会觉得说我靠 ， 现在已经 60 年过去了 ， 我居然还是不能在终端之下， 呃 。

**吴涛** [1:37:58]
很方便的搞出颜色 。

**Rio** [1:37:59]
让用户看到我希望他看到的颜色 ， 就这么难 ， 真是 。

**吴涛** [1:38:05]
对 ， 就是要也要吐槽的一件事 。

**Rio** [1:38:07]
对 ， 就如果你使用 item， 然后你要把让 ， 想让 item 看起来漂亮一点的话 ， 你一定会折腾 ， 你一定折腾过这个配色方案这个东西 ，但是如果你折腾的话 ， 你会觉得我靠 ， 这真是一个巨大的坑啊 ， 就是 ， 呃 ，Unix 的 。

**吴涛** [1:38:22]
这个这个话题我们估计这里不能展开了 。

**Rio** [1:38:24]
没有 ， 没有 ， 我觉得我靠 ， 为什么历史的这个枷锁一直到 60 年前好像还套在我的头上， 我为什么要去去去去在意什么 16 色 、256 色之类的东西 ， 那 。

**吴涛** [1:38:37]
没错 。

**Rio** [1:38:38]
而在 fish 这边就没有这个问题了 ， 就你想用什么颜色就用什么颜色 ，因为它不需要去做兼容性这种东西 。

**吴涛** [1:38:45]
对 ， 当然了 ， 除开我们刚 ， 就刚才讲的以上所有 shell 都是一个叫做类 Unix 系统的上面使用的 shell 嘛哈 ，但其实还有一些大家比较常见的 shell，但更没有提 dos promote。

**Rio** [1:39:00]
对 ，其实我们刚才说过了 ，但是这个东西 ， 首先 dos promote 从来不会把自己叫做一个 ， 把自己称为一个 shell， 对吧 。

**吴涛** [1:39:08]
叫做 shell， 它叫 promote。

**Rio** [1:39:10]
对 ， 然后 。

**吴涛** [1:39:11]
然后在这个东西怎么进 ，在现在的 Windows 里面你打开这个开始菜单 ， 搜索 cmd， 它就会出来一个命令行 。

**Rio** [1:39:19]
对 。

**吴涛** [1:39:20]
哎 ， 它它中文叫什么来着 ？

**Rio** [1:39:21]
这叫 dos 命令行 。

**吴涛** [1:39:22]
这叫命令行窗口吧 ， 就中文版的它那个 。

**Rio** [1:39:25]
中文版就叫 dos 命令行 。

**吴涛** [1:39:26]
应该叫是吗 ？OK， 然后你打开就会出现一个黑黑不拉几的窗口 ， 然后今天可能里面最多人跑的两条命令 ， 一个是叫做 ， 呃 ，ipconfig， 看自己的这个 IP 地址 ， 然后第二就是 ， 呃 ，ping， 然后第三可能还就是那个了 ， 就是 ns lookup。

**Rio** [1:39:44]
对 。

**吴涛** [1:39:44]
查那个 DNS 域名。

**Rio** [1:39:46]
没错 。

**吴涛** [1:39:46]
这些比较常用 ，dir， 然后列表的一些作用 ， 呃 ， 这个可能现在用的越来越少 。

**Rio** [1:39:54]
想想还挺讽刺的 ， 你在这样一个时代连看检测自己能不能 ， 呃 ， 连接到另外一台计算机的最常见的方法居然还是就是用到使用 ， 使用一个源自于电传打字机时代的 ， 呃 ， 一个一个特征 ， 一个一个命令行窗口来输入一台 ， 输入一个 ， 呃 ，70 年代的工具的名字 。

**吴涛** [1:40:20]
历史的包袱还是很沉重的 。

**Rio** [1:40:21]
没错 ， 就是在过去的四五十年里面居然没有一个方法能够替代它 。

**吴涛** [1:40:27]
嗯 ， 对 ，但也有一些像 Windows 上也有一些比较晚进的新鲜的东西了 ， 这个叫做 PowerShell，PowerShell 应该是在 Windows 几 ，Windows 7 吧 ， 还是 Vista 的时候才 。

**Rio** [1:40:40]
我记得 NT 时代就已经开始研发了 ，anyway。

**吴涛** [1:40:43]
我没有用 NT， 我印象中只有在 Vista 或者 Windows 7 里面见过它 。

**Rio** [1:40:48]
然后 PowerShell 是个什么东西呢 ？ 就是一个 ， 呃 ， 就 Windows 在早期会觉得说我靠 ， 这个 GUI 难道不是一统天下的东西吗 ？

我为什么要去搞命令行这一套 ，但是后来他们意识到命令行其实生命 ， 命令行就像野草一样 ， 或者就像 ， 像像底层的 。

**吴涛** [1:41:07]
命令行还是非常有用的 。

**Rio** [1:41:08]
像细菌一样 ， 然后永远活着 ， 对吧 ， 那他们发现没办法 ， 我们也得搞一个程序员能用的命令行 ，但是他们最后 。

**吴涛** [1:41:16]
啊 ， 对 ， 我想起来 ， 这个是 Windows NT 的那个服务器的那些延伸过来 ，因为当时好像他们提了一个口号是说所有能够在 ， 就所有通过图形界面能做的 ， 对于这个 Windows NT 的操作都可以通过命令行的方式来执行 ， 然后这个命令行就是 PowerShell。

**Rio** [1:41:32]
呃 ， 然后他们就搞出 PowerShell 这个东西 ， 这个东西当然跟 sh 是不兼容的 ， 这是毫无 。

**吴涛** [1:41:40]
怎么可能呢 ？

**Rio** [1:41:41]
但是这个东西的语法是非常 ， 就学习 ， 学习曲线是比较陡峭 ， 它首先它区分大小写 ， 就你把它做成微 ， 微刷 basic 多好 ， 就不区分大小写 ， 首先它区分大小写 ，其次它的很多参数和 ， 呃 ， 做许多事情的这个方法都非常的啰嗦 ， 它可能 ， 它它希望把很多事情做得很正统或者很很有条理 ，但其结果就是如果你有 ， 呃 ， 这个 Unix shell 的背景

的话 ， 你会觉得我说这这套东西真是啰嗦到一个境界了 ，但是我不知道纯粹的微软程序员会怎么想 ， 可能会感官会不一样吧 。

**吴涛** [1:42:27]
不过它这有一个好处 ， 就刚才我说了嘛 ，因为因为它的设计原则是说所有图形界面能做的事情它都能做嘛 ， 所以它的这个就是 ， 就是 feature completeness， 就是这个功能的完整性 ，是所有目前所有 shell 里面最强大的 。

**Rio** [1:42:42]
没错 。

**吴涛** [1:42:42]
就是 ， 就你可以完全抛弃这个图形界面 ， 然后通过这个这个 shell 的方式去改变一个 Windows NT 的服务器的任何部分 ， 任何一个部分 。

**Rio** [1:42:53]
对 。

**吴涛** [1:42:53]
对吧 。

**Rio** [1:42:54]
因为在 Unix 里面它就有一个哲学 ， 就是纯文本 ， 纯文本至上嘛 ， 对吧 ，在 Unix 里面 ， 呃 ，在不同命令之间流淌的纯文本流可能是你唯一能够依赖的东西 ，但是在 Windows 的 PowerShell 里面 ， 很多东西它已经不再是纯文本的东西了 ， 就是它是基于对象的 。

**吴涛** [1:43:13]
它是一个 structured。

**Rio** [1:43:14]
你可以在两个 。

**吴涛** [1:43:15]
Object。

**Rio** [1:43:16]
你可以在两个命令之间传递一个 object， 这在这在 Unix 里面是不可想象的 。

**吴涛** [1:43:22]
就结构 ， 结构化的数据传输 ，而不是基于文本的这个数据传输 。

**Rio** [1:43:28]
对 ， 这在这在 Unix 里面你即便能做到 ，也是要通过一大堆什么 tir 啊 ， 什么什么 auth 啊之类的来来实现 。

**吴涛** [1:43:37]
就可靠性很差嘛 ， 简单来讲 ， 就灵活性很强 ，但可靠性很差 。

**Rio** [1:43:41]
没错 。

**吴涛** [1:43:42]
然后判断各种 edge case 比较麻烦 ， 然后 PowerShell 就完全没有这个问题 ，因为它可以传达 ， 传输一个结构化的对象 ， 保证不需要经过这个序列化 、 反序列化造成的种种问题 。

**Rio** [1:43:54]
你可以直接去 。

**吴涛** [1:43:55]
啊 。

**Rio** [1:43:55]
可以直接去 access 里面的某一个某一个 property。

**吴涛** [1:43:59]
对 ，而且它的 ，因为它是被自上而下设计出来的这么一个 shell 嘛 ， 它的语法虽然说你可能觉得啰嗦 ，但是它好像是比较规整 ， 就是 regular。

**Rio** [1:44:08]
你可以举一反三 ，不像不像 Linux。

**吴涛** [1:44:11]
像德语一样 。

**Rio** [1:44:12]
好吧 ，不像英语 ， 你必须不停的去 RTFM， 你必须不停的去看音标 ， 对吧 。

**吴涛** [1:44:18]
对 ， 你去记住各种特例到底怎么一回事 ， 会会比较痛苦一些 。

**Rio** [1:44:25]
呃 ， 对 。

### 命令行之用

**吴涛** [1:44:26]
啊 ， 刚才讲了那么多 shell 的来龙去脉的种种好处 ，其实我们有一个核心的要探讨的问题 ， 就是为什么要用 shell， 为什么要用命令行 。其实这才是本期的重点 ， 就如果你对 shell 的 。

**Rio** [1:44:38]
但重点估计只有 5 分钟 。

**吴涛** [1:44:40]
对 。

**Rio** [1:44:41]
来龙去脉如果你已经了如指掌的话 ， 那前面的部分真的是可以自己去看书 ， 可能会比较快一点 ，但是我们做了这么多历史的铺垫 ， 介绍了这么多杂七杂八的东西 ， 只是想要强调说命令行的生命力在今天还是非常旺盛的 。

啊 ， 就是因为 。

**吴涛** [1:45:00]
所以为什么要用命令行 ？

**Rio** [1:45:02]
因为它在哪 。

**吴涛** [1:45:06]
哈哈哈 ，不 ， 它在哪不一定你要用 ， 它的它的魅力在哪里 ， 为什么 ？

**Rio** [1:45:09]
首先我觉得命令行是非常 ， 呃 ， 简单的一件事情 ， 就是你在 。

**吴涛** [1:45:15]
呃 ，define 简单 。

**Rio** [1:45:18]
你在 ， 呃 ， 你在使用一个 60 年代开始就已经在被使用的技术 ， 它是非常的易于理解的 ， 它简单的一个特征 ， 比如说你 ， 呃 ， 只能在单一时间只能在屏幕的单一地方输入一个字符 ， 对吧 ，不像 。

**吴涛** [1:45:37]
单 ， 天生单任务系统啊 。

**Rio** [1:45:39]
没错 ，不像你在使用一个图形界面的时候 ， 你你用鼠标你会你会想要说你你要找一个按钮 ， 你但是你的目光你在搜索这个按钮的时候 ， 你会看到很多其他东西啊 ， 命令行不是 ， 命令行就是空荡荡的一个东西在那摆着 ， 然后你要是想不起来的话 ， 你就想不起来 ， 然后你要去找的话 ， 你很有可能你就你要么找 ， 你可以直接找到你要找的东西 ，

要么你要么你就完全找不到 ， 对吧 。

**吴涛** [1:46:05]
嗯 ， 所以这个是缺点 ， 就它的可发现性比较差嘛 。

**Rio** [1:46:10]
呃 ， 任何事情都是双刃剑嘛 ， 我觉得就是使用这个图形界面的时候 ， 你我经常会觉得 distracted， 就是 。

**吴涛** [1:46:21]
因为屏幕上太多了这种 bling bling 的小广告 。

**Rio** [1:46:24]
屏幕上会显示着很多你此时用不到 ，但是你很有可能在下一秒就要用到的东西 。

**吴涛** [1:46:31]
嗯哼 。

**Rio** [1:46:32]
呃 ，但你又不可能 ， 或者说目前还没有一个软件会把所有的 ， 呃 ， 菜单和工具条全都做成 ， 呃 ， 隐藏式的或者是浮动式 ，因为这个是如果那样的话 ， 你又需要去动一下鼠标才它们才会弹出来 ， 或者是你需要去按一个什么东西 ， 反正总所有这些都会让你觉得命令行就是这个图形界面固然方便 ，但是有时候也特别的啰嗦 ， 命令行就不一样了 ， 你可能你

所要做的两件事情就是敲命令和按回车 ， 啊 ， 或者说你所要做的两件事情就是输入和输出 ， 然后所有这些东西都是在一个特定的地方出 ， 呃 ， 完成的 ， 然后你需要关注的点也就只有那么一点而已 。

**吴涛** [1:47:18]
嗯哼 。

**Rio** [1:47:19]
再有就是我觉得其实命令行下面的工具要更切中要害一点 ， 比如说比如说 git， 要看 git 的这个 revision history， 我基本上只会用 tick， 就我不是没有用过其他的什么 source tree 或者是 ， 嗯 ，Atlassian 出的那个网页版的工具叫什么来着 ， 我不记得了 ，但是所有这些看 git revision 的工具感觉都没有 tick 方便 ， 呃 ，而打开 tick 的

步骤也就是输入 tick 按回车而已 ， 没有什么 ， 就一步之遥 ， 然后你离开也只有一步之遥 ， 你不需要去点一个工具 ， 点一个图标 ， 然后看它运行 ， 然后选入选那个 repository 之类的 ， 对吧 。

**吴涛** [1:48:06]
嗯 。

**Rio** [1:48:06]
就我觉得命令行下面很多工具都比较短小 ， 然后切中要害 ， 这也是个原因 。

**吴涛** [1:48:11]
所以所以其实这句话 。

**Rio** [1:48:13]
你中文翻译成英文 。

**吴涛** [1:48:15]
就是在 Unix 里面这个 Unix 大部分是一个命令行驱动的工具 ， 就生态系统嘛 ， 对吧 ，他们追求的这么一个 ， 就设计哲学叫做 do one thing and do it well。

**Rio** [1:48:27]
对 ， 就是这样 。

**吴涛** [1:48:28]
就一一个工具只做一件事 ，并且把这件事做到极致 。

**Rio** [1:48:32]
对 ，而在 。

**吴涛** [1:48:33]
然后比如说刚才讲的这个 tick， 它可以去浏览这个这个 git 的 repository 的情况 ， 还有其他各种各样的小工具 ， 它可以去 ， 比如说可以去列表一个目录的内容啊 ， 或者是查在一个文件里面查找东西啊 ， 它都是些很小的一个步骤 ， 然后呢 ，因为由于命令行的这个管道的功能 ， 它可以使得 ， 呃 ， 两个程序之间配合 ， 比如说上一个程序的输入 ， 呃 ， 输出变成下一个程序

的输入 ， 然后这个这个链条是可以 ， 呃 ， 扩展无限长的 。

**Rio** [1:49:07]
没错 。

**吴涛** [1:49:07]
它们之间存在一个叫做可组合性 ， 就是说如果你的是一个工具箱里面有锤子 ，有钉子 ， 还有有锤子 ，有扳手这些这些东西之外， 它还能组合成一些一套完整的工具链 ， 使得你可以完成各种各样比较复杂或者更加更加灵活的去应对这个工作场景 。

所以就是工具的这个完善性 ， 每一个工具的这个小巧可靠 ，以及它们之间的相互组合性 ， 我觉得这个是命令行 ， 呃 ， 这个生态最大的魅力所在 。

**Rio** [1:49:40]
没错 ，而反过来在这个图形界面之下， 你就没有这样的概念存在 ， 就是你你你怎么样才能把一个图形界面的工具的输出转入到另外一个图形界面的工具的输入里面 ， 你看你 copy and paste 嘛 。

**吴涛** [1:49:55]
也有 ， 对 ，copy and paste 或者叫做 drag and drop 嘛 ， 或者是拖拉 。

**Rio** [1:49:59]
对 ，但这些是没有办法自动化的 ， 没有办法同时说我我永远要把 。

**吴涛** [1:50:05]
自动化这些倒不是一个问题 ， 我觉得最主要的问题就是说它们因为因为图形化的这个内容的传递之间不存在这个一个叫做 universal interface。

**Rio** [1:50:17]
对 。

**吴涛** [1:50:17]
Universal interface 就是统一的接口 ， 就是这个文本 text 嘛 ， 它不就图形化的界面 ， 它不存在这么一个 ， 呃 ， 一个通用的一个接口 ， 使得并不是所任意两个程序之间的这个输输出都是可以直接 drag and drop 来来来组合的嘛 。

所以必须说你开发了 ， 假设哈 ， 你在 Photoshop 里面编辑了一个图片 ， 然后你要导入到另外一个工具里面去做一个进一步的处理 ， 你得把它变成一个 ， 啊 ， 文件 ， 然后再再 hopefully 你的那个下一个环节的工具能够打开上一个环节这个这个工具生成的图片 ， 然后导入到自己的这个里面 ， 然后再做进一步的操作 ， 对吧 。

**Rio** [1:50:56]
对 。

**吴涛** [1:50:57]
所以 ， 呃 ， 这这里就就有一个这个 ， 呃 ， 这个就 composability 这个合成性的问题会比稍微差一些 ，但这只是一个我们理解通常状况 ，但也有很好的这个合成性相对还不错的这么一个环境 ， 比如说在像现在的 iOS 上面就有 ， 就因为这个它没有文件系统暴露出来 ，也没有命令行暴露出来给你用嘛 ， 所以这个这个上下游的配合是你必须要考作为这个系统设计者 ， 你必

须要考虑的一个问题 。 那现在就说你可以分享到某一个应用里面去 ， 对吧 ， 然后你如果那个应用它大刚好能够接受这么一个图片格式或者文件格式也好 ， 它是其实能够把这个链条传下去的 ， 只是说 ， 呃 ，由于 ， 哎 ， 还是那个问题嘛 ， 就不存在这个 text as universal interface 这么一个核心要件 。

**Rio** [1:51:47]
不是会通过一个强有力的机构来要求所有的程序都必须实现一下这个跟其他这个程序交互的接口 ， 所以 。

**吴涛** [1:51:55]
对 ， 所以这个整个还是也相对来说比较难一点 ， 然后我觉得可能命令行对我来说另外一个好处就是它可以表述一些比较复杂的一个概念 ， 比如说因为有这个 shell，有这个 shell, 呃 ， 语法的存在 ， 它其实是一个 ， 它是一个叫做 tooling complete language， 它是一个完整的编程语言 ， 对吧 ， 所以其实里面可以做一些相对来说很复杂的或者更加抽象的一些操作 。

**Rio** [1:52:21]
对 。

**吴涛** [1:52:21]
而这些操作通过点点鼠标这种图形化的方式是比较难办到的 。

**Rio** [1:52:26]
对 。

**吴涛** [1:52:26]
比如说很多人都遇到过这个难题 ， 啊 ， 你一个目录里面 ， 呃 ， 就假设文考虑文件的情况下哈 ， 你你要批量改一堆文件的文件名 ， 比如前面加一个前缀或者去掉一个后缀这种事情 ， 你不借助一些特殊的工具 ，在这个 ， 呃 ， 图形界面里面是很难实现这一点的 ， 你不可能一个一个点鼠标去改 ， 对吧 ，但是在命令行下面你其实你因为有这个语法的这

个一个编程语言的存在 ， 你其实可以对这些文本做一些 ， 呃 ， 很高级的操作 ， 然后这些然后把这些操作变成一个实际可以执行的代码 ， 然后这个代码可能去调用一个比如说 move 修改文件名的这么一个命令去执行它 ， 所以这里面也是一个很重要的问题 ，但可能现在图形界面里面最接近这个的应该是就是像 OS X 自带的那个叫做 autometer， 就自动机 ， 呃 ， 自动化的一个

工具 ， 那个那个图标是一个机器人， 白色的机器人拿着一个黑色的枪还是什么乱七八糟的 。

**Rio** [1:53:23]
这个管子吧 ， 那不是枪 。

**吴涛** [1:53:25]
啊 ， 管子 ， 对 ， 黑色的管子 ， 对 ，pipe， 然后它做可以你可以做一些组合 ，但是 。

**Rio** [1:53:31]
一万个 micro 一个会会用这个就已经很高 。

**吴涛** [1:53:34]
就是高高阶 OS X 的用法的用户才会去 ， 呃 ， 理解或者使用到的这么一个场景嘛 ， 我偶尔也会用到 ， 然后它里面做的一些功能其实也蛮强大的 ， 比如说它可以批量的从一个 ， 呃 ， 假设哈 ， 一个 PDF 文件里面抽取出多少页 ， 然后再把这些页批量的转化成一个一个图片文件 ， 然后再单独出现在某个地方 ， 对吧 ， 或者是批量的去修改一些文件图片文件

， 比如说转换格式啊 ， 改变文件大小啊 ， 再压缩啊 ， 这种它也也也可以有 ，但是它的学学习曲线还是比较陡峭的嘛 。

**Rio** [1:54:09]
没错 。

**吴涛** [1:54:10]
当然了 ， 命令行也有它自己的缺点了 ， 比如刚才讲的这个 ， 呃 ， 就发现性比较差 ， 就是如果你不知道有一个功能可以用什么方式来实现 。

**Rio** [1:54:19]
你就是不知道怎么用 。

**吴涛** [1:54:20]
没有人会告诉你 。

**Rio** [1:54:21]
不像在图形界面里面你必须去点 ， 到时候点到时候试 ， 对吧 。

**吴涛** [1:54:25]
对 ， 你可以去大概找得到它在哪里 ， 如果命令行里面你找不你不知道它在哪 ， 你你就真的是你不知道它是什么 ， 你真的就不知道去哪里找 ，但是一个笨办法就是一个一个去读这个 manual 读手册嘛 ，但是 。

**Rio** [1:54:38]
但有些 cache 啊是有些有些有些点子是如果你没有人告诉你的话 ， 你就是不知道的 ， 对吧 ， 比如说 。

**吴涛** [1:54:45]
对 ， 需要需要实践 ， 需要去累积嘛 。

**Rio** [1:54:48]
对 ， 就你会需要真的有一个传承 ，有一个师傅去告诉你这个东西就是这样 ， 你得你得这么用 ，不然就是不行 ， 比如说 ， 呃 ， 从 docs， 呃 ， 命令行到 window 到 linux 转换的过程中， 你可能会遇到一个问题 ， 就是怎么样改名一个文件 ， 对吧 ， 呃 ， 你会发现 linux 没有 rename 这个功能 ， 你会说我说我靠怎么会改文件这种东西是做不到的 ， 这不可能吧 ，但是直到有一个人告诉你

说你要 move， 就是 。

**吴涛** [1:55:16]
你要移你要移动一个文件 。

**Rio** [1:55:18]
移动一这个把一个 a 一个东西从 a 移动到 b 的工具也可以完成把一个东西从 a 命名为 b， 这是这是需要一个需要有人告诉你的这件事情 ， 对吧 ， 呃 ， 类似的例子还有什么 ， 比如说你在 docs 下面你我觉得什么 copy sing.

呃 ，copy sing.txt 空格 sing.exe， 你可以批量的把所有的那个纯文本文件转换为 exe 文件 ，但在 linux 下面这是做不到的 ， 对吧 ， 你会说我靠为什么就得有一个人跟你解释这个 linux 下面的这个所谓 ， 呃 ，shell extension 这个东西叫什么来着 ， 啊 ，interpolation。

**吴涛** [1:56:04]
扩展 。

**Rio** [1:56:04]
对 ， 命令行扩展跟 docs 下面的机制是不一样的 ， 对吧 ， 这很多东西你都需要自己去弄弄明白

。

**吴涛** [1:56:13]
这也是所以现现在其实网有网络也好啊 ，因为如果之前我们我我们当时用命令行的时候只能看杂志上面有一个小 tips 的区域 ， 对吧 ， 就非常有限的或这个也没办法搜索的 。

**Rio** [1:56:26]
对 。

**吴涛** [1:56:26]
现在就有很多这种网站 ， 它会用那种叫做那种这种就是小摘要的形式去告诉你说有这么一个功能 ， 你可以用怎么方怎么拿几个命令组合可以实现这么一个功能 ， 比如说像什么这这种叫 come on life food 的这么一个网站 ， 就可以做类似的事 。

**Rio** [1:56:42]
我觉得那个时候学 linux 真的是用生命在学啊 ， 我靠你要冒着把自己的那个心爱的游戏分区搞丢的危险 ， 装一个 linux， 然后要买要要从那个 ， 呃 ， 书店里面买 Unix 的教程 ， 然后要看着杂志上面的文章一点点学 ，不像现在我靠开一个虚拟机 ， 然后另外开个浏览器 ， 简直是飞扬的一日千里可以学会我们那个时候需要一个月才能学会的东西 。

**吴涛** [1:57:12]
嗯哼哼 ， 对 ， 呃 ， 这个节目的最后我们介绍一些我觉我们觉得还挺有用的这种命令行小工具吧 ， 就可能很多人有些你可能知道 ，但不不一定每个你都知道 ， 对吧 ， 所以讲一下大概有什么好玩的 。

**Rio** [1:57:27]
行 。

### 工具推荐

**吴涛** [1:57:28]
呃 ， 先说那个就这个我们之前提到过讲在讲包管理器的时候提到过在 OS X 上有个叫做 Homebrew 的东西 ， 可以帮你解决这个怎么去新增这种命令行工具的一个困惑 。

**Rio** [1:57:39]
叫 meta。

**吴涛** [1:57:40]
这个是要必装的 。

**Rio** [1:57:41]
Meta command line tool。

**吴涛** [1:57:42]
对 ， 啊 ，但这个不属于命令行工具本身了 ， 那我们就先略过 ， 啊 ， 下面开始我们一个人介绍一个吧 。

**Rio** [1:57:49]
好 ， 我先来一个 ， 呃 ，lolcat。

**吴涛** [1:57:52]
哈哈 ， 这是干嘛的 ？

**Rio** [1:57:54]
Linux 下面 linux， 呃 ，Unix 下面有 cat， 对吧 ， 就是有没有 dog，但是有 cat，cat 是 ， 呃 。

**吴涛** [1:58:00]
猫是干嘛用的 ？

**Rio** [1:58:01]
猫是输出用的 ， 这其实 ， 呃 ， 挺 。

**吴涛** [1:58:05]
猫的作用是说它 ， 呃 ， 从它的把它的输入打到输出里面 。

**Rio** [1:58:11]
你可以把一个文件的内容输出到 ， 呃 ，standard out 上， 然后那么 lolcat 是什么呢 ？ 是是一个可以把你的输出用彩虹的颜色输出到这个 ， 呃 ， 啊 ，不 ， 把你的输入用彩虹的颜色输出到 standard out 上面 ， 就是在一个支持多彩的这个 shell 里面 ， 呃 ， 呃 ，shell， 呃 ，emulator 里面 ， 它可以把 ， 啊 ， 字符按照这个 ， 呃 ， 固定的色谱 ， 嗯 ， 用用这个红橙黄绿青蓝紫的这所有颜色输出出来 ，也就是

说你你的你可能你不用你用普通的 cat 的话 ， 你只会输入一个单色的东西 ，但你用 lolcat 的话 ， 你的整个输出都会显得多彩 。

**吴涛** [1:59:00]
所以这是一个有趣而而无用的命令行工具 ， 对吧 。

**Rio** [1:59:04]
类似我还有很多 ， 比如说那个 sl， 就如果你把 ls 打成 sl 的话 ， 它会出一个出辆火车还是什么东西 ， 就是说你又打错了这种感觉 。

**吴涛** [1:59:17]
嗯 ， 对 ， 呃 ， 这刚刚也提到个这个叫做 tick 的工具 ， 就 git 大家都知道是一个用于做源代码管理的一个命令行工具哈 ， 然后 tick 就是把 git 反过来写的话 ， 它是一个基于 encourse 的一个 。

**Rio** [1:59:32]
显示 revision revision history 的图形界面 ， 对 ， 非常有用 。

**吴涛** [1:59:36]
就不止 revision history， 它可以显示很多东西 。其实在里面还可以做一些比较 ， 呃 ， 常用的操作 ， 比如说什么 。

**Rio** [1:59:43]
就 。

**吴涛** [1:59:43]
Git 的大部分功能都可以在 tick 里面实现了 。

**Rio** [1:59:46]
对 。

**吴涛** [1:59:47]
对 ， 所以这是一个挺好用的工具 ，因为很多人说那个很多人从那个 SVN 迁过来 ， 特别是 Windows 下面程序员 ，他可能觉得哎呀 ， 这个 git 的没有没有很好的这个图形化工具 。

**Rio** [1:59:58]
对 。

**吴涛** [1:59:58]
怎么办 ，其实是有的 ， 像什么 source tree 刚才也提到过了哈 ，但是像我们这种死忠的粉还是习惯于说用这种基于命令行的一个基于这个文本窗口的那工具 ， 然后 tick 是一个很好的选择 。

**Rio** [2:00:10]
我觉得 git 也是一个奇葩到没有办法做出一个好用的命令行 ， 呃 ， 图形界面的工具 。

**吴涛** [2:00:17]
嗯 ，有很多人还是用的挺好的 ， 只是说很多高级功能就好像说我刚好就刚刚就好像我说的一样 ， 刚才那个为什么选择命令行的原因是一样的 ，git 就很多高级功能只只可能在通过文本就是命令行的方式表述出来 ，因为用图形方式表述实在是太费劲了 。

**Rio** [2:00:34]
对 ， 我觉得用图形界面表示出来就是操操作 git 树的话 ， 我其实能够想到的最符合直觉的一种方法就是你可以直接去拖拽那个 ， 呃 ，branch 里面的节点 ， 然后让它在你想要去的那个地方 ， 呃 ， 停留下来 ， 然后松手 ， 然后这个图形界面的工具就自动帮你完成对应的 git 操作 ， 这个才是最符合直觉化的一个一个实现 ， 现有的只不过现有的大部分的图形工

具只不过是把那些命令行的命令封装成一个一个按钮而已 ， 你还是没有办法直接看到 ， 呃 ， 执行这些命令之后那个 source tree 会变成什么样子 ， 对吧 。

**吴涛** [2:01:12]
还有就是那个就是可组合性和这个表达的这个抽象层级的问题 。

**Rio** [2:01:17]
对 。

**吴涛** [2:01:18]
你始终那种可视化的抽象层级是要相比语言描述的还是要低一些 ， 低很多的嘛 。

**Rio** [2:01:26]
低嘛 。

**吴涛** [2:01:27]
低一个 order。

**Rio** [2:01:28]
哈哈哈 。

**吴涛** [2:01:30]
OK， 啊 ， 下一个你有什么介绍的 ？

**Rio** [2:01:32]
啊 ， 我可以介绍 cowsay。

**吴涛** [2:01:37]
又是一个有趣而没有什么用 。

**Rio** [2:01:40]
这个 cowsay 有个有一个变种叫做 cowthink， 就是你你 brew install cowsay 之后你会得到两个命令 ， 一个叫 cowsay， 一个叫 cowthink， 然后结果就是它会把你的输出 ， 呃 ， 包裹到一个漫画的那种 。

**吴涛** [2:01:55]
输入 。

**Rio** [2:01:55]
啊 ，不对 ， 它会把你的输入包裹到一个漫画的那种 ， 呃 ， 想或者是说的那种 。

**吴涛** [2:02:01]
气泡框里面 。

**Rio** [2:02:02]
对 ， 然后旁边下面画一头牛 ， 这就是它的用途 。

**吴涛** [2:02:06]
就是牛说 。

**Rio** [2:02:07]
对 ， 然后另外有个工具叫做 Fortune， 就是跟你说一句 ， 啊 ，其实就是那种中餐馆里面的那个 ， 呃 ， 小 cookie 里面 。

**吴涛** [2:02:15]
Fortune cookies。

**Rio** [2:02:17]
一个小纸条 ， 大概是那个意思 ， 然后它会跟你说很多名人名言 ， 然后你把 Fortune， 呃 ， 重定向到 cowsay， 它就会把名人名言包裹到一个 ， 呃 ，bubble 里面 ， 然后让牛说出来 。

**吴涛** [2:02:30]
就是那个那个中餐馆的小 cookie 这个事情应该是只有在国外的人才会知道这个梗吧 。

**Rio** [2:02:35]
对 ， 没错 ， 就是中在国外的中餐馆 somehow someway 会提供一种非常特别的 ， 啊 ，在你结账的时候会给你一个小 cookie， 然后这 cookie 其实是非常难吃的一种饼干 ， 只不过这个 cookie。

**吴涛** [2:02:47]
哎 ， 我觉得还挺好吃的 。

**Rio** [2:02:49]
What？ 我头一次遇到喜欢吃 Fortune cookie 的人。

**吴涛** [2:02:52]
哈哈哈 ， 脆脆的嘛 ， 挺好吃的 。

**Rio** [2:02:56]
然后这个面皮 。

**吴涛** [2:02:57]
它是空心的 ， 对吧 ， 它是空心的 ， 然后你把它打开 ， 里面有一个小纸条 。

**Rio** [2:03:01]
啊 ， 小纸条 。

**吴涛** [2:03:02]
你看里面会 ， 对 ，有时候是中英文的 ， 这至少德国是 。

**Rio** [2:03:07]
绝大部分都是中英文的 。

**吴涛** [2:03:08]
英英德文的 ， 就是一边是英文一边是德文 。

**Rio** [2:03:11]
哎 ， 对对对 。

**吴涛** [2:03:11]
然后在在北美就是中英文的 。

**Rio** [2:03:13]
对 ， 会会给你一句小格言 ， 比如什么 ， 你举个例子 ， 一时想不起来什么 。

**吴涛** [2:03:19]
我一时也想不起来 ， 反正就是 ， 呃 ， 就是有一种 。

**Rio** [2:03:25]
那什么 ？

**吴涛** [2:03:26]
箴言是不是不是名言 ，是箴言吧 ， 应该叫什么 ， 就是它会讲一个看似很有道理的一句话 ，但实则是没有什么卵用 。

**Rio** [2:03:33]
会讲一句有趣而无用的话 。

**吴涛** [2:03:35]
啊 ， 对 ， 差不多这个意思 。

**Rio** [2:03:37]
对 。

**吴涛** [2:03:38]
然后 Fortune 这个软件差不多就干类似的事情 。

**Rio** [2:03:41]
类似 。

**吴涛** [2:03:43]
啊 ， 下面一个挺有用的一个命令行工具叫 mtr。 啊 ， 这个是干嘛 ， 这可能做网络或者是你对网络状况比这个要这个有有研究 ， 就是互联网计算机网络有研究的人会经常用到 ，有有两个工具 ， 一个叫做 traceroute， 一个就叫 ping 嘛 ，ping 是测这个延迟 ， 然后 traceroute 是测这个你跳转的 ， 你从你从 ， 呃 ， 你的电脑到另外一个服务器之间要经过哪些这种中转中间的路由或者是

这个网关 ， 对吧 。

**Rio** [2:04:16]
对 。

**吴涛** [2:04:16]
然后 mtr 是把这两个工具的功能合二为一 ，并且以一种更加友善和有用的方式汇报出来的一个这种网络诊断工具集合 。

对 。

**Rio** [2:04:30]
它的名字叫 maths traceroute。

**吴涛** [2:04:33]
对 。

**Rio** [2:04:33]
Maths 的 traceroute。

**吴涛** [2:04:35]
对 ， 那个专 maths 作者 。

**Rio** [2:04:37]
对 。

**吴涛** [2:04:38]
啊 ， 那你现在接下一个叫做 pri， 你介绍一下是什么呀 ？

**Rio** [2:04:43]
呃 ，pri 和 ipython 我想放在一起介绍 ， 就是 。

**吴涛** [2:04:46]
OK。

**Rio** [2:04:47]
呃 ，Python 的用户一定要使用 ipython 这个东西 ，而不是使用 Python 默认给你装的那个老掉牙的 ido。ipython 是一个 ， 呃 ， 既可以在命令行下面跑 ，也可以有一个专属的网页版本 ， 或者乃至于一个基于 Qt 的图形界面的一个 ， 呃 ， 全功能 Python 笔记本 ， 你可以在里面运行 Python 的程序 ， 你可以在里面尝试 Python 的各种新功能 ，而且你的每一次输入和每一每一次输出都会被记在 in 和 out 两个 area 里面

， 你可以随时去查询 ， 然后它还内置了很多 ， 呃 ，其他的功能 ， 比如说什么语法高亮啊 ， 呃 ， 那个 ， 呃 ，traceroute， 呃 ，cowstack， 嗯 ， 的 backtrack，backtrack，backtrace，backtrace 啊 ， 嗯 ， 然后 pri 就是 ， 呃 ，Ruby 的 ipython 可以这么理解 。

**吴涛** [2:05:43]
OK。

**Rio** [2:05:43]
两个也是非常有用 。

**吴涛** [2:05:45]
刚讲到那个 ipython， 我还推荐一个叫做 bpython， 就是 ab 的 b 啊 ，bpython。

**Rio** [2:05:50]
OK。

**吴涛** [2:05:50]
呃 ，ipython 它是也是一个这个就是 Python 的一个叫做 repo 嘛 ，read evaluate print loop 这么一个工具 。

**Rio** [2:05:58]
对 。

**吴涛** [2:05:59]
bpython 是一个替代的一个 repo， 然后它的好处是什么呢 ？ 它首先它有语法高亮 ， 就对 Python 语法它是你敲的这个每一行它是语法高亮的 ， 它的多行模式也比较支持比 ipython 要好 ， 然后它觉得最有用的功能 ， 它会对你打的这个标准库里面的函数 ， 它是有这个就是那个叫什么 ， 类似于一个 ID， 它是有提示那个函数的一个签名 ，以及每个参数是干什么用的 。

**Rio** [2:06:23]
OK。

**吴涛** [2:06:24]
就非常非常好用 ， 呃 ，而且它的那个没有 ipython 那么功能丰富 ， 它是一个更加 ， 呃 ， 轻量级的这么一个 repo 嘛 。

**Rio** [2:06:33]
对 。

**吴涛** [2:06:33]
大概是 。

**Rio** [2:06:34]
iPython 我相信如果你有是要做一些什么科学计算或者是 ， 啊 ， 生物信息学之类的话 。

**吴涛** [2:06:41]
做科研 。

**Rio** [2:06:42]
基本上是对 ， 呃 ， 人手必装的一个东西 。

**吴涛** [2:06:45]
对 ， 啊 ， 我再介绍一个叫做 iperf3， 这也是一个做网络性能的测试的一个工具 ， 就是说假设你想测 ， 比如你们家刚装修房子 ， 你想测这个装修师傅给你装的网线是否达到千兆的一个 ， 呃 ， 一个一个速度 ， 对吧 ， 你怎么办 ？

你找两台电脑都插上网线 ， 对吧 ， 然后在一头运行一个 ipython3 的一个 server， 然后在另外一头运行 ipython3 的一个客户端 ， 一个 client， 然后把这 client 指向那个 server， 它就会在这两端发起一个这个一个连接 ， 然后就测试这个连接能最能最大以多快的速度传输 ， 对吧 。

**Rio** [2:07:25]
OK。

**吴涛** [2:07:26]
就它是一个测试这个网络连通速度的这么一个小工具 。 这 3 是一个最新的版本 ， 它有一个 ipy iperf， 没有数字 ， 就是默认是 2 这个版本 ， 相对老一点 ， 就看你的发行版的区别 。

**Rio** [2:07:38]
OK， 啊 ， 那接下来我再介绍一个 tmux， 就是刚才已经提到了 ， 是一个终端复用器 ， 就是你可能连接到一个远程的计算机上， 或者说你在本地 ， 然后你开了一个 terminal 窗口 ， 你会觉得说我靠 ， 我还想做另外一件事情啊 ， 怎么办 ， 呃 ， 一个选择是再开一个窗口或者再建立一个连接 ，而比较 ， 呃 ， 好的一个方法呢 ， 就是复用你当前已经建立的链接 ， 啊 ， 可以装 tmux 这个东西 ，

它可以通过一些这个组合键让你在一个 terminal 的窗口里面开很多个其他 terminal 的窗口 。 嗯 ， 可能描述比较抽象 ，但如果你去这个 tmux 的网站上看一下， 你会很快明白这个是什么意思 。

**吴涛** [2:08:20]
其实这个有个最大的好处你知道是什么吗 ？ 就是它可以保持你的一个登录状态 。

**Rio** [2:08:26]
对 。

**吴涛** [2:08:26]
就是你保持程序的异地状态 。

**Rio** [2:08:29]
对 ， 你可以在异态机器上用 tmux 来执行一个命令 ， 然后， 呃 ，detach from the tmux， 然后 。

**吴涛** [2:08:35]
就可以直接关掉那个和那个机器的连接 。

**Rio** [2:08:38]
对 。

**吴涛** [2:08:39]
然后但是这个时候在你刚才刚才启动那个进程 ， 它是不会不会退出的 ，因为正常情况下你断掉一个连接之后， 那个那个进程就退出了嘛 ，但是 tmux。

**Rio** [2:08:48]
除非你之前什么 ， 呃 ， 用用一个很复杂的操作 ，disown，dis， 呃 ， 先 background， 然后 disown， 然后你才不会 ， 啊 ，在你退出的时候终止这个程序 。

**吴涛** [2:09:00]
但一般人不会那么干嘛 。

**Rio** [2:09:01]
对 ， 除非你事后想到 。

**吴涛** [2:09:04]
对 ， 啊 ， 所以你用这个 t， 如果用 tmux 的话 ， 它是你退出的时候 ， 它是直接断掉和 tmux 这个这个这个 master 进程的连接 ， 然后它会还会继续接管你在里面 launch 的那些子进程 ， 然后等你回家再连上这个时候 ， 你可以用那个 tmux 空格 a， 就是 attach 这个参数 ， 重新连回之前的那个 tmux 的这个 master 进程 ， 那这个时候你会看到和你断开之前一模一样的这么

远端登录的界面 ，而你之前在执行的那个可能那个程序可能执行时间比较长的话 ， 它是不会受任何影响的 。

**Rio** [2:09:39]
对 ， 然后另外一个用例就是比如说你是一个实验室的学生 ， 然后你实验室里面有台电脑 ， 然后你的工作办公室里面有台电脑 ， 你需要在实验室里面观测一些数据 ， 然后输入到电脑上， 然后你你你要么用远程桌面 ， 对吧 ， 要么就是用 tmux， 然后在 ， 呃 ， 实验室的电脑上看到的东西会实时显示在你办公室的电脑上 ，也挺好用的 。

**吴涛** [2:10:03]
对 ， 当然 tmux 还有一个 ， 呃 ， 兄弟叫做 screen， 就是屏幕那个词的这个 。

**Rio** [2:10:09]
早期的这个一个一个终端复用 。

**吴涛** [2:10:13]
对 ，但 screen 的特性没有 tmux 的那么强大好用 ， 现在就基本上都推荐大家用 tmux 会好一些了 。

**Rio** [2:10:19]
Screen 它古老了主要是 ，而且好像 screen 好像不能分 ， 就是分 tab 吧 ， 我记得 。

**吴涛** [2:10:25]
呃 ， 可以分 tab， 它最早的版本是不能分那个分左右分屏 。

**Rio** [2:10:30]
对 ， 我就是这个意思 ， 就是不能 split view。

**吴涛** [2:10:33]
对 ，但但现在新版本是可以的了 。

**Rio** [2:10:35]
OK。

**吴涛** [2:10:36]
但只是因为搭载 screen 一般都是比较老旧的版本嘛 ， 所以这个就很难保证 ， 就 tmux 的特性大概会好一些 。

**Rio** [2:10:43]
没错 。

**吴涛** [2:10:44]
呃 ， 行 ， 我再 ， 啊 ， 这个 tmux 还有个很高级的功能 ， 你一直没有说 ， 还 screen 也有这个功能 ， 就是可以做那个 ， 啊 ，pair programming。

**Rio** [2:10:53]
啊 ， 对 ， 没错 。

**吴涛** [2:10:54]
就是可以两个人连到同一个 。

**Rio** [2:10:56]
看别人的输入 ， 对 。

**吴涛** [2:10:57]
对 ， 你可以连两个两个人从分别从自己的机器里面连到同一台服务器 ， 然后调用一个 tmux 的一个一个终端 ， 就互相可以看一下对方在那个里面打什么 ，也可以就是 。

**Rio** [2:11:08]
对 。

**吴涛** [2:11:08]
进行一对一的这么一种 ， 呃 ， 辅导式的教学 。

**Rio** [2:11:12]
只不过容易打架啊 ， 就是学好 。

**吴涛** [2:11:14]
这个就是你要自己约定好到底是谁教谁学嘛 ， 对吧 。

**Rio** [2:11:17]
对 ， 最好能协同一下 。

**吴涛** [2:11:19]
对 ， 就是两个做这种 pair pro， 结结对编程 ， 对吧 ，pair programming 的时候比较有用的一个工具 。

**Rio** [2:11:26]
没错 。

**吴涛** [2:11:27]
啊 ， 我再介绍一个叫做 tree， 就是树那个那个工具 ， 这个是干嘛用的呢 ？ 就是说你在命令行里面你要去 ， 你要去叫做 navigate file system， 就是你要在文件系统里面去看来看东西 ， 到底哪个文件在哪 ， 你在哪个结构里面 ， 对吧 ， 经常常用的是 list 嘛 ， 就是或者是 ， 呃 ， 这个就是 list， 就是列表一个目录里面的文件 ，但 list 一般只能列一层嘛 ， 就是你只能看当前

或者某个指定目录下面的这个文件列表 ，但是你是看不到这个整个文件 ，因为文件系统是一个整个是一个树状结构嘛 ， 你你是不能用 list 看到整一个树状结构怎么样子的 ， 然后 tree 这个这个小工具就可以做类 ， 就做做这个事 ， 它会把这个文件系统从你指定的层开始 ，以一个树的形式把它打印到这个这个终端窗口上面去 ， 那你可以比较直观的看到你的这

个这个 ， 比如整个这个代码的工程目录里面的文件结构是怎么样子的 ， 就还比较有用 。

**Rio** [2:12:27]
啊 ， 那我也来顺便推荐一个 midnight commander 好了 ， 就是 。

**吴涛** [2:12:32]
OK。

**Rio** [2:12:33]
啊 ，因为这也是从 ， 呃 ，tree 想到的 ， 就是 ， 呃 ，total commander 是 DOS 时代乃至 Windows 时代非常受欢迎的一个文件管理工具 。

**吴涛** [2:12:42]
嗯哼 。

**Rio** [2:12:42]
后来有有好事者把它移植成了一个 ， 呃 ，command line interface 的这么一个东西 ， 就是你输入 mc 就会出现一个类似于那个 total commander 的一个一个全屏的工具 ，也是 encourage， 然后里面也有什么 ， 比如说列出当前命令树啊 ， 批量拷贝啊 ， 这个批量重命名啊之类的功能 ， 然后如果你是一个熟练的 ， 嗯 ，total commander 用户的话 ， 你会你会发现里面很多很多的操作是一模一样的 。

对 ，而且这个东西最大的一个特征 ， 它是跨平台的 ， 就是它在 Linux 和 DOS 上面都有 。

**吴涛** [2:13:22]
OK。

**Rio** [2:13:23]
还蛮特别的 。

**吴涛** [2:13:24]
还挺帅 。 呃 ， 那我推荐另另外一个系统管理用的工具叫做 htop， 呃 ， 就很多系统里 ， 很多这个 Unix 里面都有一个内建的命令叫做 top， 然后它会列 ， 它会以一个 encourse 的方式列出 ， 呃 ， 当前系统里面正在活跃的进程 ，以及一些系统的状态 ， 比如说这个 CPU 的占用啊 ， 这个就是各个用户态内核态各占有多少比例啊 ， 内存的使用状况啊 ， 活跃的一些进程的使用资源的情况

啊这些 ，但是 top 的一个主要问题就是它展示的是一个单色 ，而且就不不方操作不方便的一个界面 。

**Rio** [2:14:01]
不够好看 。

**吴涛** [2:14:02]
不好看也不好用 ， 对 。

**Rio** [2:14:03]
对 。

**吴涛** [2:14:04]
然后 htop 就是一个 top 的 ， 就是一个改良版 ， 它可以以一种更加直观一种的方式展现出这个 top 展现的所有内容 ，并且它比如说它会展示在 ， 就默认情况下它会展示这个 CPU， 它会用一种进度条的方式去表示这个 CPU 的实际占用比例 ，以及这个内存的占用情况 ，而且它下面的那个那个就是进程列表 ， 它会也有各种各样的高级功能 ， 比如说它可以以一个树状的结

构展示这个进程列表 ，而不而不是一个单纯的 。

**Rio** [2:14:35]
单纯 。

**吴涛** [2:14:36]
对 ， 就是非常建议大家都 ， 这是我每次装新系统的时候都必装的一个一个软件 ， 大致的作用跟大家看到那个叫做 activity monitor 在 OS 上这个功能是差不多的嘛 。

**Rio** [2:14:49]
只不过是在命令行下面 。

**吴涛** [2:14:51]
哎 ， 没错 。

**Rio** [2:14:52]
然后很多人做他们的那个 ， 呃 ， 当前命令行的截图都会专门找一个窗口开这个 ， 就 。

**吴涛** [2:15:00]
嗯哼 。

**Rio** [2:15:02]
呃 ，也算是一个现象级的软件 。

**吴涛** [2:15:04]
对 。

**Rio** [2:15:05]
OK， 嗯 ， 那我来推荐一个 ， 我来推荐一个命令吧 ， 叫做 open， 或者是 ， 呃 ， 或者说我来推荐一组这个在 ， 呃 ，OS10 上面 ， 呃 ，在命令行下面工作的时候 ， 你可能会出现一些 ， 比如说你要把命令某一个文件的内容或者是某些输出 ， 呃 ， 弄到系统剪贴板上的 ， 呃 ， 场景 ， 或者你需要把系统的剪贴板的内容输入到某一个命令的输入里面 。

**吴涛** [2:15:41]
嗯哼 。

**Rio** [2:15:41]
啊 ， 或者你需要利用系统级的一个工具 ， 比如说你要打开一个 PDF， 呃 ， 怎么办呢 ？ 你可以用 ， 呃 ， 首先 ， 呃 ， 剪贴板的话你可以用 pbcopy 和 pbpaste 两个两个功能 ， 两个命令分别可以把命 ， 呃 ， 这个剪贴板里面的东西拷贝或者是粘贴出来 ，而如果你想要打开某一个文件的话 ， 你可以用 open 这个命令 ， 比如说 ， 呃 ， 你想要在 finder 里面观察当前的目录 ， 你可以 open 空格点

， 就可以打开 ， 就可以在 finder 里面打开当前目录 ， 如果你想要打开当前目录下面所有的 PDF 文件 ， 那你可以打 open 新 .pdf， 嗯 ， 呃 ， 系统会自动调用 preview 或者是 adobe， 呃 ，reader， 取决于你选择的默认程序是什么 ， 来打开来打开所有的 PDF 文件 ， 算是一个小 tipp。

**吴涛** [2:16:36]
嗯哼 ， 那个 pbcopy 和 pbpaste 用法可能还要再解释一下 。

**Rio** [2:16:41]
啊 ， 就是 pbcopy，pbcopy 这个命令的输入 。 你你需要把你的程序的输出重定向给 pbcopy。

**吴涛** [2:16:53]
对 ， 就它是它是它是指 ， 呃 ， 指从 ， 呃 ， 从它的输 ， 把它的输入复制到系统剪贴板里面嘛 ， 然后 pbpaste 就刚好反过来 ， 它是把它的系统剪贴板的内容导到它的输出里面去 ， 所以用法肯定就是说是从 pb 导入 ， 就是内容导到 pbcopy 里面去 ， 然后从 pbpaste 里面导出这么一个管道的用法 。

**Rio** [2:17:14]
比如说你在网页上选中了一段一段话 ， 然后你要把这段话排序 ， 可以在你可以先 ， 呃 ， 选中这段话按 cmd+c， 然后到命令行下面打 pbpaste pipe sort pipe pbcopy， 然后你就把这个 ， 呃 ， 剪贴板里的内容排序了 。

**吴涛** [2:17:33]
对 。

**Rio** [2:17:34]
大概是这么一个用法 ， 对 。

**吴涛** [2:17:35]
行 ， 那这个命令就介绍到这里吧 。

**Rio** [2:17:38]
嗯 。

**吴涛** [2:17:38]
因为要以上介绍的所有命令都 ， 呃 ， 除了刚才讲的那个 OS， 就是 OS10 原生的 pbcopy pbpaste open 之外， 都 。

**Rio** [2:17:46]
都需要你额外装 。

**吴涛** [2:17:47]
都不是系统自带的 ， 你就要需要通过这个 ， 比如说 Homebrew 的方式去自己装 ， 如果你是其他 ， 呃 ， 类 Unix 系统的话 ， 用你可以用你自己的包管理器去装这个工具哈 。

**Rio** [2:17:59]
没错 。

**吴涛** [2:17:59]
啊 ， 对 ， 那我们今天的这个节目就到此为止了 。

### 尾声

**Rio** [2:18:03]
好 ， 真的说了好多 ， 哈哈 ， 这真是可以拆成两期的节目 。

**吴涛** [2:18:09]
嗯哼 。

**Rio** [2:18:09]
呃 ， 好吧 ， 反正关于这个命令行的这个所谓 command line full 的 ，command line 空 ful 的这个一个东西 ， 真是 ， 呃 ， 说之不尽啊 ，不妨推荐大家去这个 commandline full dot com， 就这这个名是怎么来的呢 ？

就是因为外国人不明白空 ful 这个词是什么意思 ，他们会把某些东西的技巧叫做什么什么 ful， 比如说搜搜 Google 的技巧叫做 Googleful， 然后 command line 的技巧叫做 commandlineful， 然后 commandline fu dot com， 然后你可以在这里面找到很多很多实用的这个命令行的啊 tips。

**吴涛** [2:18:46]
嗯哼 。

**Rio** [2:18:47]
好吧 ， 啊 ， 感谢收听 IPN Podcast 网络旗下 IT 技术主题娱乐节目 ， 我们号称 ， 啊 ， 我们叫内核恐慌 ， 我们号称 hardcore，但是也没有干货 ， 想听的人听 ，不想听的人别听 。

呃 ， 你可为本节目捐款 ， 捐款地址是 cardinalpanic.fm slash donate， 捐款金额随意 ， 只要是 8 的正常数倍就可以了 。 捐款不会为你带来什么 ，不捐也不会让你失去什么 ， 我们的口号是 no hard feelings。

啊 ， 如果你有任何反馈 ， 欢迎发邮件到 cardinalpanic@ipn.li， 同时也欢迎收听 IPN 旗下几档节目 ，《IT 公论 》，《 为之道 》，《 太一来了 》，《 流星通讯 》，《High Story》，《 硬影像 》，《 无次元 》，《 薄雾志 》，《 玄美 》。

啊 ， 我们下期节目再会 。

---

本节目库由 PodHood（https://podhood.com）提供支持——播客网站平台。
