Shell 实用技巧集锦

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 把标准输入转成命令参数,常与 findgrep 配合做批量操作:

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 做日志统计、dfdu 定位磁盘问题,都是日常排障的基本功。建议把常用的 alias 写进 ~/.bashrc,把高频操作沉淀成脚本,让命令行真正成为效率工具。


   转载规则


《Shell 实用技巧集锦》 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
qBreakpad 踩坑记:ARM 平台崩溃转储收集 qBreakpad 踩坑记:ARM 平台崩溃转储收集
在 ARM 嵌入式平台上,程序崩溃后往往只留下一句模糊的报错,日志里很难定位到崩溃现场。qBreakpad 是基于 google-breakpad 封装的 Qt 库,可以在程序崩溃时自动生成 dump 文件,方便事后用符号文件还原调用栈。本
2021-01-31
下一篇 
netstat 命令详解 netstat 命令详解
netstat 命令用于显示各种网络相关信息,如网络连接、路由表、接口状态(Interface Statistics)、masquerade 连接、多播成员(Multicast Memberships)等等。它是排查网络问题最常用的工具之一
2021-01-17
  目录