终端命令速查:一篇故意写长的文章
这篇是故意写长的: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' 一致。
head
只看开头,默认十行,-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
不带参数列出全部命令,按分组展示;带参数看某一条的用法。
banner
重放开场画面。不小心 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 块 |