visitor@wangyvdi.top:~$ cat posts/003_长文本_终端命令速查.md

终端命令速查:一篇故意写长的文章

#命令 #速查 #终端 5 min

这篇是故意写长的:head -n 20 只能看到开头,wc -l 会给出一个像样的数字,grep 过滤 能在里面找到匹配行并带着文件名一起返回。想验证长文在终端里滚起来顺不顺手,也用它。

下面按用途分组,每条命令给一句人话说明和一个最小例子。

浏览

ls

列目录。默认就是长格式:大小、权限、修改时间都摄开;-1 只给名字(一列、不带图标),-l 也认,但它本来就是默认值。

visitor@localhost:~$ ls
posts  internal  ui  README.md  main.go
visitor@localhost:~$ ls -1 posts/

另外:-a 在这里是被明确拒绝的。点开头的路径(.git、.ssh)对访客根本不存在,不是“隐藏会得”,所以没有“加个参数就能看到”这回事。

cd

切目录。相对路径、绝对路径、.. 都认,和真 shell 的逻辑一样,只是这一切发生在这一棵树里。

visitor@localhost:~$ cd posts
visitor@localhost:~/posts$ cd ..
visitor@localhost:~$ cd /ui/templates

pwd

告诉你现在在哪。树里的路径和网页 URL 是同一套,所以 pwd 的输出可以直接拼到域名后面。

tree

画目录树。默认递归到底,-L 2 只画两层。树大的时候先 -L 一层层看,比 ls 反复切目录快。

visitor@localhost:~$ tree -L 2
visitor@localhost:~$ tree ui/

cat

打印原文。读的就是磁盘上那份文件,一个字节都不改,所以 cat 的输出和 curl '?raw=1' 一致。

只看开头,默认十行,-n 改。看 front matter 长什么样的时候最有用。

visitor@localhost:~$ head -n 8 posts/001_what_is_ssh_blog.md

wc

统计行数、词数、字节数、字符数和最长行。-l 只给行数,-c 只给字节数。写文章的时候用它估篇幅。

open

把一个路径对应的网页地址打出来。终端里读到一段,想发给别人,用这个。

找东西

grep

全文搜索。带路径就缩小范围,不带就搜整棵树。命中行会带上文件名和行号,方便接着 cat 那一段。

visitor@localhost:~$ grep 端口转发
visitor@localhost:~$ grep goroutine internal/

命中太多时它只打前 40 处,最后补一行“共 N 处命中”,不会把终端滞死。结尾那个参数只要是存在的路径,就当搜索范围用——和 Linux 里的 grep 一样。

random

随机挑一篇文章打印原文。用来检验"写了很多但没人看"这件事。

这个程序本身

which

每条命令实现在哪个 Go 文件的哪一行。这不是写死的一张表,而是启动时用 runtime.FuncForPC 现算的。

visitor@localhost:~$ which grep
visitor@localhost:~$ which tree

type

区分内置命令和别名。ll 是别名叫向 ls,rg 叫向 grep,type 会把这件事说清楚。

man

比 help 更细:用法、实现位置、Go 源码三样一起给。

source

把实现某条命令的 Go 代码整段打出来。读的就是服务器上这棵树里的 .go 文件——博客的源码和文章是同一份目录,所以它能自省。

参数可以是命令名(只打印实现它的那个函数),也可以是文件路径(打印整个文件)。

visitor@localhost:~$ source grep
visitor@localhost:~$ source ui/theme.css

codesearch

在源码里搜正则,默认只搜 internal/。想弄清某个行为是怎么实现的,比在网页上翻文件快。

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

不带参数列出全部命令,按分组展示;带参数看某一条的用法。

重放开场画面。不小心 clear 掉之后想再看一遍那个大字和最新文章列表。

whoami

你是谁。这个名字来自启动参数 -author,默认 visitor。

date

服务器时间。

ping

你的来源 IP 和服务器地址。测反代有没有把真实 IP 头透下来的时候用。

url

把一个 URL 拆成 scheme、host、port、path、query、fragment。调试带参数的地址很顺手。

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 块

在终端里读这篇:ssh -p 2022 wangyvdi.top cat posts/003_长文本_终端命令速查.md (原文 是同样的纯文本)