应该会作为一个系列更新连载,涵盖 Missing Semester 全系列,感觉还蛮水的。

前言

很早之前就知道有 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 命令,软连接硬链接
  • Data Wrangling 最重要的大概是 Regex 吧,有两个不错的学习网站

还有一个 Stackoverflow 上对 Regex 的收集

命令行 (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
  • uniq

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 (属于是朝圣了)

Vim 篇
有错误请指出,欢迎补充

    qazxcdswe123 推荐的 Ubuntu,而是推荐 Arch Linux。文末给出观点。

    这里是不是“课程推荐的是Ubuntu,但是我推荐Arch Linux”的意思?

      BA3000 若是想学习Linux,我认为不用纠结使用哪一款系统,他们可能会在所使用包管理器等方面有差别,但不影响学习基本知识,更加适合自己的东西会随着接触越多更加明晰。(不用太在意推荐的是什么,遇到各种各样的问题自己解决也是一种学习)
      (逃....

      BA3000 抱歉,复制过来格式乱了,导致多了个回车,现在应该没歧义了。
      大概想讲的是 “互联网上的人推荐新手用 Ubuntu”, 确实是很直白很简单,网上资源也十分丰富,额外驱动相对丰富的 Linux 发行版,使用下来除了界面莫名其妙的卡以外基本没啥问题。背靠 apt 软件较多,想安装额外软件也能通过添加 ppa 解决部分。不过就软件安装简易程度还是 Arch 更简单,而且之前两个大 LTS 版本界面都不流畅(lag for no reason),很神秘。
      各个 Linux 间命令基本相通的,每个发行版都是作者们客制化的展现,正如楼上所说,想学 Linux 哪个发行版都行,没用到一定程度大概只是包管理器不一样和皮不一样的区别。
      感觉有点跑偏了,学的是 *nix, 学的是CLI,学的是通用的技术,学的不是 Distro,这是不一样的,哪个 Linux 都是 Linux,纠结用哪个是没意义的,用起来用的顺就行,学会了通用技术不管是 Server || Desktop 都是触类旁通了。

      我的建议:2022年安装使用体验最好的方案

      双系统方案:Fedora

      • 没有 snap 那样的捆绑营销式的闭源服务困扰,snap 真卡
      • 安装器只要配好语言、时区、分区、密码就装好了,不浪费时间。常用的工具都内置了
      • 背靠红帽公司,很多红帽工程师都是用 Fedora 工作的、他们顺便负责维护,质量真得强。CentOS 的前身
      • 内置的软件版本都很新不旧,也不会因为最新版而 bug 多
      • 虽然 dnf 包少一点,但常用的都不会缺、比 debian apt 好用太多了。其他困难可以装其他系统虚拟机解决

      虚拟机方案:Ubuntu / Multipass
      新建、连接、备份等等操作,全部是一两行命令行配置完成。底层是一个 VirtualBox 虚拟机,不会有 WSL 那样的种种限制

      19 天 后

      Editors (Vim) 篇

      前言

      其实不久之前,我对 Vim 的评价还是花里胡哨的,有这时间学 Vim 不如学点其他的,VSCode 不香吗,就搁着装逼呢?
      VSCode 香死了,几乎零配置成本,开箱即用,插件多多,然而用了一段时间 Vim 后,我已经被它这种文本编辑模式和高度的可自定义性所吸引,回不去了 🙁
      可能下面很多东西都花里胡哨的,不过就我来说,我用得很爽 😃 ,不服不辨。
      本文不讲使用,只介绍。


      另外推荐使用版本较新的 Neovim,相对于原版 Vim 功能更丰富,插件更多。最好不要用 Debian Ubuntu 自带的老版本,部分插件不支持。

      原生 Vim

      Vim学习

      网上有很多了,重要的是跟着做,十分推荐用 Neovim 的 Vimtutor,左侧是带批改的。

      Vim 的局限

      1. 上手难,估计用上几年都能发现新东西
      2. 十分十分耗时间,自定义选项特别多(当然也是优势,搞 Vim 就要有养成的觉悟)

      Vim 额外功能

      1. :term full-program-name 直接在 Vim 里面运行终端程序
      2. <C+v> 矩形选择,对于添加注释有用

      自定义 Vim

      配置文件

      如果使用 Vim, 文件为 .vimrc , 如果使用 Neovim, 文件为$HOME/.config/nvim/init.vim (要自己新建)
      可在 Github 上搜 dotfiles 可参照别人的配置文件进行修改
      最重要的大概是显示相对行号,几乎是离不开的

      为 Vim 安装插件

      修改 Vim 配置文件,为 Vim 添加各类插件
      目前主流的有两个 Vim 插件管理器,一个是Vim-Plug , 另一个是 dein.vim ,作为两者的区别为 Vim-Plug 老牌,十分易用,而 dein 作为较新(历史不新技术新)的插件管理器会更快,但相对来说易用性差一点(其实在插件少的情况下,感觉没啥区别),更推荐使用 Vim-Plug
      插件管理器的安装请参照上方给出的 Repo 说明,主要一点就是要能终端访问 Github ,插件基本都是从 Github 上面下的。

      插件推荐

      Vim 比 VSCode 相差最大的我觉得就是 Vim 没有一个统一的扩展商店,Vim 插件不好找(而且也不知道有这个需求),很多时候是靠 dotfiles 间相传,这里推荐一些很基础的,人人都需要的。

      和 WSL 中的 Linux 共享剪贴板

      source

      curl -sLo/tmp/win32yank.zip https://github.com/equalsraf/win32yank/releases/download/v0.0.4/win32yank-x64.zip
      unzip -p /tmp/win32yank.zip win32yank.exe > /tmp/win32yank.exe
      chmod +x /tmp/win32yank.exe
      sudo mv /tmp/win32yank.exe /usr/local/bin/

      完全共享剪贴板只要在 init.vim.vimrc 中添加一行 set clipboard=unnamedplus ,来修改 Vim 的剪贴板位置(不推荐,使得原生寄存器功能缺失,但确实很方便)

      Vim 的剪贴板

      更准确来说是 Vim 的寄存器(Register),了解一下不难,但不了解的话复制粘贴都是问题。
      https://www.brianstorti.com/vim-registers/

      额外折腾

      Vim 以外

      Vim 的理念私以为减少离开键盘,避免在鼠标键盘间的来回切换,那在代码以外的领域也是这样的,很多情况下对一些常用的功能(打开文件夹,打开软件)也是可以用快捷键进行操作。一些系统自带的快捷键很好用,想自定义快捷键的话这里推荐软件 AutoHotkey 来自定义快捷键。
      有个非常极端的使用例子来自 LinuxTechTips 的首席剪辑师 Taran,日常剪片时候用五个键盘,四个键盘专门用于快捷键的存放,主要使用的就是 AutoHotkey

      具体使用方法请 Google Taran macro king (国内字幕翻译为宏孩儿 xD)或看他存放配置文件的 Repo 他也在 LTT 和自己的频道出过几个视频演示,还蛮有意思的。
      还有 Chrome 下的 Vim 扩展 Vimium d 键滚屏和 JK 切 Tab 太香了。

      TUI

      除了熟知的 GUI ,其实还有 TUI(Terminal UI),在终端中的界面,用的好的话,完全可以像 Emacs 一样成为操作系统,稍微介绍一些软件。

      • 终端下的文件管理器 ranger 切文件很快
      • 终端下的 Git UI lazygit,简化 Git 操作,Windows terminal 需要在 Profile 下的 Appearance 中开启 Text Formatting 下的 Bold font with bright colors
      • tmux 必备,或类似多终端软件
      • 配置好的 zsh

      随想

      • 什么时候觉得 ESC 太远了,什么时候就算熟悉 Vim 了,Normal Mode 是最常待的 Mode,u 的 undo 应该最小化
      • 真的很浪费时间啊,不过用起来确实很爽啊
      • 我学的很浅,我也还在学-.-

        qazxcdswe123

        我觉得 Vim 等 CLI 编辑器,在当下的意义主要在于两点:

        1. 从中观察和感受到到早期程序员文化,还有一些心照不宣的约定与习惯,设计 API、debug 等等时候潜移默化可以少很多坑
        2. 在一些无法用 VSCode GUI 或者 VSCode RemoteSSH 的服务端的环境(特殊架构的服务器、嵌入式系统之类的),兜底情况有比较好的编辑体验,CLI 依然还是一个根本(尤其是搞安全和后台的方向意义很大)

        VSCode 本身还是属于比较高的抽象层级,会有「抽象泄漏」陷入僵局的可能性。

        © 2018-2025 0xFFFF