Shell 是每个开发者的日常工具,掌握一些高频技巧能显著提升命令行下的工作效率。本文整理了别名定义、后台任务管理、重定向与管道、批量处理、进程管理、磁盘排查等实用技巧,每个技巧都配有可直接运行的示例,方便边看边练。
alias 命令别名
对于经常输入的长命令,可以用 alias 定义一个短别名:
alias ll='ls -alF'
alias gs='git status'
alias ..='cd ..'
alias # 查看当前会话的所有别名
alias ll # 只查看某一个:alias ll='ls -alF'
echo "alias gs='git status'" >> ~/.bashrc # 写入 ~/.bashrc 持久化
source ~/.bashrc # 重新加载使其生效
别名只在当前 shell 会话中生效,想永久保存就写入 ~/.bashrc(zsh 用户写入 ~/.zshrc)。临时想绕过别名用命令本身,在前面加反斜杠即可,例如 \rm file.txt。
后台任务:&、jobs、fg、bg、nohup
在命令末尾加 & 可以让它在后台运行,同时立即释放终端:
./long_task.sh & # 末尾加 & 放入后台运行
jobs # 查看当前 shell 的后台任务
fg %1 # 把 1 号任务调回前台
bg %1 # 让被暂停的任务在后台继续运行
后台任务默认绑定当前终端,终端一关任务就会被挂断。要让任务在退出登录后依然存活,用 nohup,输出默认追加到 nohup.out;如果任务已经在后台跑了,来不及用 nohup,也可以用 disown %1 把它从当前 shell 的任务表中摘除:
nohup ./long_task.sh > /dev/null 2>&1 &
重定向与管道
标准输入、标准输出、标准错误分别对应文件描述符 0、1、2。最常用的输出重定向和管道:
echo "log" > out.txt # 覆盖写入
echo "log" >> out.txt # 追加写入
cmd > out.txt 2>&1 # 标准输出和标准错误写入同一文件
cmd > /dev/null 2>&1 # 丢弃所有输出
ps aux | grep nginx # 管道:前一命令的输出作为后一命令的输入
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head
make 2>&1 | tee build.log # tee:屏幕显示的同时保留一份到文件
注意 2>&1 的顺序不能颠倒,必须先写 > out.txt 再写 2>&1,否则标准错误会重定向到当时尚未改向的标准输出(通常是终端)。
xargs 批量处理
xargs 把标准输入转成命令参数,常与 find、grep 配合做批量操作:
find . -name "*.tmp" | xargs rm -f # 批量删除
find . -name "*.log" -print0 | xargs -0 rm -f # 文件名可能带空格时
grep -rl "old" ./src | xargs sed -i 's/old/new/g' # 找到并批量替换
find ./imgs -name "*.png" | xargs -n 2 -P 4 convert -resize 50% # -n 每次传参个数,-P 并行
命令替换 $() 与进程替换
$(...) 把命令的输出直接嵌入到另一条命令中:
echo "当前日期:$(date +%F)"
tar -czf backup_$(date +%F).tar.gz ./data # $() 支持嵌套,比反引号可读性更好
diff <(sort a.txt) <(sort b.txt) # 进程替换:把命令输出当作临时文件
进程替换 <(...) 的典型用法就是像上面这样 diff 两个命令的处理结果。
查找与结束进程
用 ps 配合 grep 查找进程,用 kill 发送信号结束进程,默认信号是 SIGTERM(15),加 -9 则强制 SIGKILL:
ps aux | grep nginx | grep -v grep # grep -v grep 排除 grep 自身
pgrep -l nginx # 也可以直接按名称拿 PID,输出更干净
kill 12345 # 优雅终止
kill -9 12345 # 强制终止
pkill nginx # 按名称结束进程
pkill -9 -f myapp # -f 匹配完整命令行
killall python3 # 结束所有同名进程
df/du 查看磁盘占用
df 查看文件系统层面的磁盘使用情况,du 查看目录或文件占用的空间,-h 表示以人类可读的单位显示:
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 32G 18G 64% /
磁盘突然爆满时,先 df -h 定位哪个分区满了,再用 du 层层往下钻:
du -sh . # 当前目录总大小
du -h --max-depth=1 . # 各子目录大小,只看一层
du -sh * | sort -rh | head -10 # 占用最大的前 10 个
排查时别忘了 /var/log 这类日志目录,以及已被删除但进程仍持有句柄的大文件(可用 lsof | grep deleted 找到)。
小结
这些技巧单独看都不复杂,组合起来威力不小:find + xargs 做批量清理、管道加 awk/sort/uniq 做日志统计、df 加 du 定位磁盘问题,都是日常排障的基本功。建议把常用的 alias 写进 ~/.bashrc,把高频操作沉淀成脚本,让命令行真正成为效率工具。