在 IDE 横行的今天,我们这些程序员依然需要跟终端打交道,三五年下来,谁还没踩过一些坑,又或者自己琢磨出一些能让效率起飞的小窍门呢?
今天不聊那些 ls -la 比 ls 好用之类的基础知识,只分享那些真正改变我工作流、甚至让旁边同事忍不住探过头来问"哥们,你这手速没单身30年练不下来吧"的实战技巧。

快速定位系统性能瓶颈
服务器或者自己电脑突然变卡,得快速知道是谁在捣鬼。
bash
# 查看哪个目录最占硬盘空间(只看当前目录下一级)
du -ah --max-depth=1 | sort -rh | head -n 10
# 按 CPU 使用率列出排名前 10 的进程
ps aux --sort=-%cpu | head -n 11
# 按内存使用率列出排名前 10 的进程
ps aux --sort=-%mem | head -n 11
环境和配置管理?交给专业的来
以前,管理本地开发环境简直是一场灾难。一会儿要配 PHP,一会儿又要弄 Node.js,还得装个 Python。各种环境变量、数据库配置写在 .bashrc 或 .zshrc 里,像这样:
bash
# 老办法:用函数切换环境
switch_env() {
if [ "$1" = "proj_a" ]; then
export DB_HOST="localhost"
export DB_PORT="3306"
echo "切换到项目 A 环境"
elif [ "$1" = "proj_b" ]; then
export DB_HOST="127.0.0.1"
export DB_PORT="5432"
echo "切换到项目 B 环境"
fi
}
这种方式手动维护起来很麻烦,项目一多,配置文件就变得特别臃肿,切换起来也容易出错。
但是,时代变了,朋友们。现在我处理本地开发环境,都用 ServBay。
请注意,ServBay不是命令行工具,而是一个集成的本地开发环境平台。它把程序员常用的语言,比如 PHP、Node.js、Python、Go、Rust 都打包好了,需要哪个版本点一下就行,完全不用自己去折腾编译和环境变量。
数据库也一样,无论是 SQL(MySQL, PostgreSQL)还是 NoSQL(Redis, MongoDB),都给你准备得妥妥的。而且它支持一键部署本地 AI,适合vibe coder。
用了 ServBay 之后,上面那些复杂的环境切换脚本我早就删了。所有环境和配置管理都通过一个清爽的图形界面搞定,我变强了,也变快了。
一行搞定网络调试
简单测试一下端口通不通,或者 API 能不能访问,完全没必要打开 Postman 那么重的工具。
bash
# 检查本地 3306 端口是否开放
nc -zv 127.0.0.1 3306
# 快速给 API 发送一个 POST 请求
curl -X POST http://localhost:8080/api/v1/users \
-H "Content-Type: application/json" \
-d '{"username":"test","role":"admin"}'
目录间的闪转腾挪:pushd 和 popd
还在用一连串的 cd ../../.. 来返回之前的目录吗?那也太"复古"了。试试目录栈吧。
bash
# 你当前在 /Users/me/workspace/project-a/src
pushd /etc/nginx/conf.d
# 这时你瞬间移动到了 Nginx 配置目录,并且终端会记住你来的地方
# 在这里查看和修改配置...
vim default.conf
# 搞定之后,想回去了?
popd
# "嗖"的一下,你又回到了 /Users/me/workspace/project-a/src
pushd 可以多次使用,它会把目录一个个地压入一个"栈"里。可以用 dirs -v 查看这个栈,然后用 pushd +N 跳到指定的目录。对于需要在多个不相关的目录之间反复横跳的场景,这就是大杀器。
文件操作的骚操作
用 cp 复制大文件时,看着光标一动不动,你是不是也曾怀疑过电脑是不是死机了?
bash
# 安装 rsync (macOS 自带,Linux 大部分也自带)
# 复制文件并显示进度条
rsync -avh --progress source-large-file.zip /path/to/destination/
查找文件,find 命令固然强大,但参数复杂得像咒语。我更推荐用 fd,一个更快、更友好的替代品。
bash
# 安装 fd (brew install fd / apt install fd-find)
# 查找所有 tsx 文件
fd ".tsx$"
# 查找并删除所有 .log 文件
fd ".log$" --exec rm {}
批量重命名文件,也不用再写复杂的脚本了。
bash
# 比如把所有的 .jpeg 后缀改成 .jpg
for img in *.jpeg; do
mv "$img" "${img%.jpeg}.jpg"
done
历史命令的魔法:!! 和 !$
这个绝对是手残党和健忘症患者的良药。最常见的场景就是,刚敲了一个需要管理员权限的命令,然后......
bash
# 信心满满地创建目录
mkdir /usr/local/my-app
# 得到一个冷冰冰的 "Permission denied"
# 这时候别傻乎乎地重敲一遍,优雅地输入:
sudo !!
# 这行命令会自动展开成:sudo mkdir /usr/local/my-app
!! 代表上一条完整的命令。而 !$ 则更精妙,它代表上一条命令的最后一个参数。
bash
# 创建一个藏得很深的项目目录
mkdir -p projects/a-very-long/and-nested/project-name
# 紧接着,想进入这个目录
cd !$
# 是的,它会自动展开成:cd projects/a-very-long/and-nested/project-name
# 或者,想在那个目录下创建一个文件
touch !$/index.js
自从熟练掌握了这两个符号,我的键盘方向上键和 Ctrl+C 的使用频率都降低了不少。
进程管理不用抓狂
以前杀个进程,得先 ps aux | grep xxx,然后复制 PID,再 kill -9 PID,一套操作下来黄花菜都凉了。现在,我们可以更直接一点。
bash
# 按名字干掉某个进程
pkill -f "gunicorn"
# 优雅地请所有 Python 脚本进程"离开"
pkill -f "python.*.py"
对于我们这些经常和端口打交道的开发者来说,端口被占用的问题更是家常便饭。下面这个函数,我把它写进了我的 .zshrc 里,谁用谁知道。
bash
# 定义一个函数,专门用来释放被占用的端口
free_port() {
lsof -i tcp:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9
echo "端口 $1 已释放"
}
# 比如,干掉占用 8000 端口的那个"钉子户"
free_port 8000
给 Git 整个外挂
把这些别名(alias)加到 ~/.gitconfig 文件里,每天能省下无数次敲击键盘的力气。
bash
[alias]
co = checkout
br = branch
ci = commit -m
st = status -sb
lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'
# 把暂存区的修改撤销回来
unstage = reset HEAD --
# 彻底丢弃上一次提交,但保留代码改动
undo = reset --soft HEAD~1
# 一键推送当前分支到远程
pushup = "!git push --set-upstream origin $(git rev-parse --abbrev-ref HEAD)"
还有一个我特别喜欢的,一键清理已经合并到主干的本地分支,分支列表干净清爽。
bash
git branch --merged main | grep -v "*|main|develop" | xargs -n 1 git branch -d
文本处理,快准狠
从日志里捞个邮箱,或者快速格式化一坨 JSON,都是日常操作。
bash
# 从文件里提取所有 URL
grep -oE 'https?://[a-zA-Z0-9./-]+' access.log
# 格式化粘贴板里的 JSON (macOS)
pbpaste | jq .
# 从 API 响应中只提取需要的字段
curl -s 'https://api.github.com/users/torvalds' | jq '.name, .followers'
把重复劳动变成自动化脚本
真正拉开效率差距的,是把那些每天都在重复的操作,变成一个可以随时呼叫的函数或脚本。
bash
# 比如,创建一个新前端项目的完整流程
new_react_project() {
npx create-react-app "$1" && cd "$1"
git init && git add .
git commit -m "🎉 Initial commit"
# 自动在 VS Code 中打开
code .
}
# 比如,在执行危险操作前,快速打包备份当前目录
backup() {
local fname="backup-$(date +%Y%m%d-%H%M).tar.gz"
tar -czvf "$fname" . --exclude-from=.gitignore
echo "备份完成: $fname"
}
把这些函数写进 .bashrc 或 .zshrc,下次再做同样的事情时,只需要敲一个命令就搞定了。
写在最后
这些技巧本身并不复杂,但它们就像肌肉记忆,一旦养成习惯,就能在日常工作中节省大量时间。对程序员来说,时间就是头发。