--- title: 终端命令速查:一篇故意写长的文章 date: 2026-10-15 tags: 命令, 速查, 终端 summary: 把一条命令一节地写下来,长得刚好可以用来测试 head、wc、grep、reading time 和终端里的滚动 --- # 终端命令速查 这篇是故意写长的:`head -n 20` 只能看到开头,`wc -l` 会给出一个像样的数字,`grep 过滤` 能在里面找到匹配行并带着文件名一起返回。想验证长文在终端里滚起来顺不顺手,也用它。 下面按用途分组,每条命令给一句人话说明和一个最小例子。 ## 浏览 ### ls 列目录。默认就是长格式:大小、权限、修改时间都摄开;`-1` 只给名字(一列、不带图标),`-l` 也认,但它本来就是默认值。 ```console visitor@localhost:~$ ls posts internal ui README.md main.go visitor@localhost:~$ ls -1 posts/ ``` 另外:`-a` 在这里是被明确拒绝的。点开头的路径(`.git`、`.ssh`)对访客根本不存在,不是“隐藏会得”,所以没有“加个参数就能看到”这回事。 ### cd 切目录。相对路径、绝对路径、`..` 都认,和真 shell 的逻辑一样,只是这一切发生在这一棵树里。 ```console visitor@localhost:~$ cd posts visitor@localhost:~/posts$ cd .. visitor@localhost:~$ cd /ui/templates ``` ### pwd 告诉你现在在哪。树里的路径和网页 URL 是同一套,所以 `pwd` 的输出可以直接拼到域名后面。 ### tree 画目录树。默认递归到底,`-L 2` 只画两层。树大的时候先 `-L` 一层层看,比 `ls` 反复切目录快。 ```console visitor@localhost:~$ tree -L 2 visitor@localhost:~$ tree ui/ ``` ### cat 打印原文。读的就是磁盘上那份文件,一个字节都不改,所以 `cat` 的输出和 `curl '?raw=1'` 一致。 ### head 只看开头,默认十行,`-n` 改。看 front matter 长什么样的时候最有用。 ```console visitor@localhost:~$ head -n 8 posts/001_what_is_ssh_blog.md ``` ### wc 统计行数、词数、字节数、字符数和最长行。`-l` 只给行数,`-c` 只给字节数。写文章的时候用它估篇幅。 ### open 把一个路径对应的网页地址打出来。终端里读到一段,想发给别人,用这个。 ## 找东西 ### grep 全文搜索。带路径就缩小范围,不带就搜整棵树。命中行会带上文件名和行号,方便接着 `cat` 那一段。 ```console visitor@localhost:~$ grep 端口转发 visitor@localhost:~$ grep goroutine internal/ ``` 命中太多时它只打前 40 处,最后补一行“共 N 处命中”,不会把终端滞死。结尾那个参数只要是存在的路径,就当搜索范围用——和 Linux 里的 `grep` 一样。 ### random 随机挑一篇文章打印原文。用来检验"写了很多但没人看"这件事。 ## 这个程序本身 ### which 每条命令实现在哪个 Go 文件的哪一行。这不是写死的一张表,而是启动时用 `runtime.FuncForPC` 现算的。 ```console visitor@localhost:~$ which grep visitor@localhost:~$ which tree ``` ### type 区分内置命令和别名。`ll` 是别名叫向 `ls`,`rg` 叫向 `grep`,`type` 会把这件事说清楚。 ### man 比 `help` 更细:用法、实现位置、Go 源码三样一起给。 ### source 把实现某条命令的 Go 代码整段打出来。读的就是服务器上这棵树里的 `.go` 文件——博客的源码和文章是同一份目录,所以它能自省。 参数可以是命令名(只打印实现它的那个函数),也可以是文件路径(打印整个文件)。 ```console visitor@localhost:~$ source grep visitor@localhost:~$ source ui/theme.css ``` ### codesearch 在源码里搜正则,默认只搜 `internal/`。想弄清某个行为是怎么实现的,比在网页上翻文件快。 ```console visitor@localhost:~$ codesearch "HelpGroups" internal/ ``` ### file 判断一个路径是什么:目录、markdown 文章、Go 源码、二进制、别的纯文本。顺手给出大小。 ## 运行中的进程 这一组报的都是现场数据,不是写死的文案。 ### buildinfo 这个二进制是怎么构建出来的:Go 版本、模块路径、vcs 修订号、构建参数。 ### deps 编进这个二进制的所有依赖模块和版本。想知道它到底依赖了几个包,看这里。 ### ps 这个进程自己的内存占用、goroutine 数量、累计请求数。跑起来之后隔一会儿再看一眼,数字会动。 ### lsof 它监听了哪些端口。SSH 一个、HTTP 一个,是不是还开着 TLS,一眼能看出来。 ### env 启动时的参数和进程环境变量里被它关心的那几项。 ### systeminfo 操作系统、内核、CPU、内存这些运行环境概况。 ### uname 运行时平台信息,和 Go 里的 `runtime.GOOS` / `runtime.GOARCH` 对得上。 ### uptime 这个进程活了多久,从哪一刻启动的。 ## 会话 ### help 不带参数列出全部命令,按分组展示;带参数看某一条的用法。 ### banner 重放开场画面。不小心 `clear` 掉之后想再看一遍那个大字和最新文章列表。 ### whoami 你是谁。这个名字来自启动参数 `-author`,默认 `visitor`。 ### date 服务器时间。 ### ping 你的来源 IP 和服务器地址。测反代有没有把真实 IP 头透下来的时候用。 ### url 把一个 URL 拆成 scheme、host、port、path、query、fragment。调试带参数的地址很顺手。 ```console visitor@localhost:~$ url https://blog.example.com/posts/001_what_is_ssh_blog.md?raw=1 ``` ### echo 把文字原样打回来。看似无用,但配合 `?raw=1` 和管道就是最好的连通性测试。 ### clear、exit 清屏、离开。浏览器里 `Ctrl+L`、`Ctrl+D` 也可以。 ## 你自己的视图 这几个命令只改**你自己**看到的那份树,别人看不到,刷新之后还在,`reset` 之后消失。 ### overlay 看看你自己改动了哪些东西:新建了几个目录、移动了哪些文件、删了什么。 ### mkdir 在自己视图里新建目录。想试试"如果这棵树长这样",不用碰真实文件。 ### mv 改名或移动,只动自己的视图。 ### rm 从自己的视图里删掉。真的文件还在。 ### reset 把自己那份视图整个丢掉,世界回到仓库原样。 ## 彩蛋 ### sudo 会很有礼貌地拒绝你。 ### make 会一本正经地告诉你“没有 makefile”。真构建是 `go build ./...`,得你自己在仓库里跑。 顺带一提,`vi`、`vim`、`nvim`、`emacs` 四条也认,各自会推荐你换个编辑器。 ## 这篇想测什么 | 想测的东西 | 怎么看 | |---|---| | 长文加载与渲染 | 直接打开这一页,滚到底 | | `head` | `head -n 20 posts/003_长文本_终端命令速查.md` | | `wc` | `wc -l posts/003_长文本_终端命令速查.md` | | `grep` 命中带文件名 | `grep 视图` | | reading time | 文章页标题下面那个 `min` 数字 | | `tree` 嵌套 | `tree -L 2 posts/` | | 代码块里的中文对齐 | 上面的 `console` 块 |