前言
很早之前就知道有 Missing Semester 这门课程,但一直没花时间学,认为自己折腾的内容其实和所教授的内容差不多,以为自己已经学过了。
但真正学了之后,才知道课程所涉及的广度和深度是自己捣鼓时很难学习到的,讲的很好很细,有基础的也可以看 文字版 学一下。
本系列主要是自己的看法。内容上尽量避免和原课程内容重复,只作为课程内容的补充。原课程讲的很好了,也不知道补充啥好
对课程的一些评价
其实我还没学完,不过也快了,也许有些对该课程的发言权。
若是看视频,隔着屏幕你都能感觉到三位讲师的热情,这是真的热爱,十分佩服。
若是看文字档,真的能感到记录的很详细,讲的也很通俗,能把整个复杂的体系梳理成线性的,基本能 Self-contain 的教程,真的很了不起;对外部链接的扩展也很到位,若是想了解更多也不会没有方向;Exercise 的设置也还可以,网上也有 答案。
缺点也是有的,首先是视频(也就是课堂上)基本就是不停的演示一连串的命令,可能相对枯燥,而且明显看得出时间卡的很紧,讲的很紧(但也没到快的程度,而且教这些内容确实无法避免枯燥的形式,课程 Note 的补充也弥补了这方面不足)。
其次是其中一位讲师口音有点重,但他出现的视频下都有校对良好的人工字幕,问题也不大。
总的来说,是很好的一门课。
正题
本文包含了以下章节内容
- Course overview + the shell 无笔记,十分基础,作为课程入门,吃饭时候看挺下饭的
- Shell Tools and Scripting 主要讲了
- Shell Script 编程
- $hebang (shebang) 的使用
- 小技巧:通过 Shell 执行命令前,可以先用
echo
打出来检验命令正确性
- Command-line Environment 大体讲了
- SIGNAL — 为什么 Ctrl+c 能够停止程序,为什么有时候不能,Ctrl+z 又是什么,学会了可以结合 Lecture 2 的 Shell 写个脚本,考验你周边只会 Ctrl+c 的朋友 (然后周围没人用 Linux )
- 前台运行,后台运行 (bg, fg, nohup, &, jobs)
- Tmux 神器,绝对值的好好学
- SSH (Port forwarding, ssh-key, ssh_config)
- ln 命令,软连接硬链接
命令行 (CLI)
在讨论会上提到,Shell 和 命令行是不一样的,GUI 也能是 Shell,只要起到了 Shell 的作用就是 Shell (Shell 九宫格)
想谈命令行( Command Line Interface ),大概离不了 Linux,甚至,我认为 Linux 的灵魂,就在于 CLI,可以说学 Linux 就是在学 CLI。没有了 CLI 的 Linux 和 Windows 的区别就是,Windows 更好用。
CLI 好在哪里,我们为什么要学它
- 从历史开始的,对各种编程语言原生适配
- 也是从历史开始的,编程相关工具的原生支持(git, vim)
- 对数据的 高效 处理 (pipe, grep, sed, awk, head, less, regex)
- 对参数的隐藏,使得其十分清爽,用熟了效率非常高,用过 Office 全家桶的都知道上面一栏功能全部列出来其实没那么方便。(GUI vs CLI)
- 对各类自动化,流水线的支持,发挥你的想象力,用 CLI 几乎无所不能 例子
- 服务器上基本都是 CLI,不用也得用
- 唯一的缺点就是门槛很高吧。。
想要参与课程的学习,使用 LInux 下的 CLI 是必不可少的(Mac 请无视),十分推荐 Windows+WSL2+Archwsl ,Ubuntu | Debian 也行 ,只要是 Linux CLI 均可,就本课程来说,不太需要虚拟机。个人 不太建议上 Linux 桌面,也不太推荐用大多数人推荐的 Ubuntu,而是推荐 Arch Linux。文末给出观点。
Linux 文件权限
一直觉得很奇怪,为什么有 755 777 这样奇怪的数字?讨论会上提出来,才知道原来是掩码实现的。最大数字 7 即为 111
- 0 = ---
- 1 = —x
- 2 = -w-
- 3 = -wx
- 4 = r-
- 5 = r-x
- 6 = rw-
- 7 = rwx
STDIO
Shell 由 IO 组成,与 C 语言的 stdio.h
和 C++ 的 iostream
共用一个 IO(大概),分别是 STDIN
0
&& STDOUT
1
&& STDERR
2
,Pipe 工作的原理也是如此,将上一个命令的 STDOUT
作为 STDIN
传入
软连接,硬链接
默认 ln 命令是硬链接,可以用 -s
实现软连接,这两者有什么区别?
可以将软连接理解为快捷方式,硬链接理解为备份
软连接实质上是指针,直接指向那个文件,删掉原始文件,将无法寻址
硬链接则是备份,只要硬盘上还有一份相连接,删掉任意一份也不会出事,而且占用空间极小,几个字节,不是一份源文件的 Copy
延申阅读
Pipe
Pipe 的每个命令是并发的,你能想到吗:)
Pipe explained with STDIN and STDOUT
How pipe works in detail
看完上面两篇,对 pipe 的原理,运作和使用一定会有更深的理解。
Pipe 用的好,对数据处理那是真的方便
经常与 pipe 联动的命令有
- grep
- cut
- sed
- awk
- less
- sort
- head
- tail
Zsh
OhMyZsh 管理器
推荐插件
- zsh-autosuggestions
- zsh-z
- colored-man-pages
- zsh-syntax-highlighting
- extract
- sudo
p10k theme
My dotfiles 注意,不要直接用别人的 dotfiles,要参考,要拿来,不要照抄,建议自己多加 alias 改善生活质量
Tmux
Missing Semester Lecture 5
Tmux 教程
Tmux 自定义配置
光标移动
默认时基本和 Emacs 是类似的,但可以更改成为 vi 键位,不过命令行下的 vi 感觉用起来怪怪的
- Ctrl+ 左右键 : 在单词之间跳转
- Ctrl+a : 跳到本行的行首
- Ctrl+e : 跳到页尾
- Ctrl+u :删除当前光标前面的文字 (还有剪切功能)
- ctrl+k :删除当前光标后面的文字 (还有剪切功能)
- Ctrl+L:进行清屏操作
- Ctrl+y : 粘贴 Ctrl+u 或 ctrl+k 剪切的内容
- Ctrl+w : 删除光标前面的单词的字符(以空格隔开的字符串)
- Alt – d :由光标位置开始,往右删除单词,往行尾删
- Ctrl+r : 搜索执行过的命令
- ! + 最近执行过的命令中的某个字符 :可快速执行最近执行过的命令
命令学习
不推荐 Linux 桌面的原因
首先,就课程来说不需要。齐次,Linux 桌面真的不好用,日用软件 生态,驱动,游戏等方面落后 Windows 一大截
Linux 的特色就是自由,可自定义程度极高,演变出来各种发行版,可以说是玩出花来,但如果不是 Power User,私以为不会用得到这些自定义选项。
Linux is free, only when your time is free
为什么 Arch Linux 这么 火,很大程度上是因为它的日用软件包最全最多,折腾反而少了。
谈 Arch 色变的原因,主要是之前安装桌面环境真的蛋疼,而只用 CLI 的话,反而没这个问题,很轻松就能安装课程中提到的额外软件(tldr neovim etc.),版本还新,不容易出问题,桌面安装现在也很 轻松了,官方脚本把先前劝退的步骤全部省略了,现在的 Arch 甚至反而适合新手用。
Debian | Ubuntu 这类保守型发行版,很适合在服务器,老包稳定,不容易搞挂服务器,但日用选 Rolling,我觉得没问题。
就 Linux 的精髓 CLI,Windows 已经抄过来了,不是开源 | 自由斗士,日用 Linux 桌面版并没有想象中那么好。
不过我也认为,每个 Programmer 都应该尝试日用 Linux (属于是朝圣了)
有错误请指出,欢迎补充