【效率秘籍】Shell 函数+别名组合拳,让 80% 的重复命令变 1 个字母

兄弟们,有没有这种场景:

你写 Python 要跑 python3 -m venv .venv && source .venv/bin/activate

你切 Git 分支要敲 git fetch origin && git checkout dev && git pull

你看日志要 tail -f /var/log/app.log | grep ERROR

每次打一遍,手都酸。

alias 大家都知道,但 alias 只能做"简单替换",带不了参数,套不了逻辑。今天教你一招更狠的:Shell 函数 ,配合 ~/.bashrc 模块化,把 80% 的重复操作压缩成 1~2 个字母。


一、为什么函数比 alias 强 10 倍

先看对比:

方式 带参数 判断逻辑 组合多命令 可调试
alias 勉强
function

alias 本质就是把字符串原样替换,写个 alias ll='ls -lh' 还能用,一旦想 alias run='python3 $1.py' 就炸了。

函数就不一样了------它是真的"小脚本",能拿 $1$2 当参数,能 if/else,能 return,还能调其它函数。


二、3 个立刻能用的实战函数

直接把这 3 个塞进你的 ~/.bashrc,保存后 source ~/.bashrc 就能用。

1. gco ------ 一个命令搞定拉取+切换+检查

bash 复制代码
gco() {
    local branch="$1"
    if [ -z "$branch" ]; then
        echo "用法: gco <分支名>"
        return 1
    fi
    git fetch --all --prune
    git checkout "$branch"
    git pull origin "$branch"
    git status --short
}

之前你要敲 4 行,现在 gco develop 就完事。

2. pyrun ------ 自动检测虚拟环境再跑

bash 复制代码
pyrun() {
    local file="$1"
    if [ -z "$file" ]; then
        echo "用法: pyrun <脚本.py>"
        return 1
    fi
    if [ ! -f "$file" ]; then
        echo "❌ 文件不存在: $file"
        return 1
    fi
    if [ -d ".venv" ]; then
        echo "🐍 用 .venv 跑: $file"
        .venv/bin/python3 "$file"
    else
        echo "🐍 用系统 python3 跑: $file"
        python3 "$file"
    fi
}

踩坑说明:我之前写 alias alias run='python3',结果在虚拟环境下它还是会用系统 python,装的库找不到。改成函数判断 .venv 目录是否存在就解决了。

3. llog ------ 带过滤关键词的实时日志

bash 复制代码
llog() {
    local file="${1:-/var/log/syslog}"
    local keyword="${2:-}"
    if [ -n "$keyword" ]; then
        echo "🔍 过滤 $keyword | 文件: $file"
        tail -f "$file" | grep --line-buffered "$keyword"
    else
        echo "📋 查看文件: $file"
        tail -f "$file"
    fi
}

用法:llog /var/log/app.log ERROR ------ 只打印带 ERROR 的行,还不会阻塞。

⚠️ 注意 grep --line-buffered 这个参数,不加的话 grep 会缓冲输出,你看到日志会延迟几秒,以为是卡了。


三、进阶技巧:让函数带颜色提示

终端里加个颜色判断,一眼知道成功还是失败:

bash 复制代码
gco() {
    local branch="$1"
    if [ -z "$branch" ]; then
        echo -e "\033[33m[用法]\033[0m gco <分支名>"
        return 1
    fi
    if git fetch --all --prune 2>/dev/null; then
        if git checkout "$branch" 2>/dev/null; then
            echo -e "\033[32m✅ 已切换到 $branch\033[0m"
            git status --short
        else
            echo -e "\033[31m❌ 分支不存在: $branch\033[0m"
            return 1
        fi
    fi
}

\033[32m 是绿色,31m 红色,33m 黄色,0m 重置。记不住可以搜 ansi color codes bash


四、终极技巧:~/.bashrc 模块化

别把所有函数都塞一个文件,按用途分:

bash 复制代码
# 在 ~/.bashrc 最后加这几行
for f in ~/.bashrc.d/*.sh; do
    [ -r "$f" ] && . "$f"
done

然后建个目录:

bash 复制代码
mkdir -p ~/.bashrc.d

分文件存放:

  • ~/.bashrc.d/git.sh ------ gco, gpl, gp 等 Git 函数

  • ~/.bashrc.d/python.sh ------ pyrun, venv 等 Python 函数

  • ~/.bashrc.d/logs.sh ------ llog, glog 等日志函数

好处:

  1. 新加函数不破坏现有配置

  2. 不用 source ~/.bashrc 重载全部,单文件改了 source 那一个就行

  3. 可以 git 版本管理 ~/.bashrc.d/,换电脑直接拷走


五、验证有没有生效

写完函数最怕------明明写进去了,不生效。两步检查:

bash 复制代码
# 1. 看函数定义
declare -f gco

# 2. 直接跑一次测试
gco main

如果 declare -f gco 输出了函数体,说明加载了。如果显示 "command not found",那就是 source ~/.bashrc 没跑,或者文件没在 bashrc.d/ 目录里。


总结

  • alias 是"快捷粘贴",函数是"小脚本",能带参数能判断

  • 3 个实战函数直接抄走用:gco、pyrun、llog

  • 模块化 bashrc,按类别分文件,比塞一个大文件清爽 10 倍

  • 验证用 declare -f,别瞎猜

一句话:能写成函数的就别用手敲,能写成 2 个字母的就别写 3 个。

今天的效率秘籍就到这里。明天周日见,聊聊 AI 行业的一些新变化。

相关推荐
TDengine (老段)5 小时前
TDengine 线程模型 — 网络、调度、执行
大数据·数据库·物联网·制造·时序数据库·tdengine·涛思数据
智购科技自动贩卖机8 小时前
自动售货机嵌入式状态机设计实战:从45个事件源到层次型状态机的工程重构
大数据·人工智能·stm32·物联网·重构·硬件架构
乐迪信息8 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
Raas1008 小时前
MAI Gateway(魔芋企业级AI网关)对比分析:AI网关和API网关区别?企业级能力差距一览
大数据·人工智能·数据挖掘·mai gateway·企业级产品
Neighbor_OldY9 小时前
云上安全配置审计与误配置修复实战:从安全组、OSS、RAM到数据库的全栈排查复盘
大数据·运维·安全·云计算
瑞码空间9 小时前
git知识点黄金笔记
笔记·git·elasticsearch
工业甲酰苯胺10 小时前
AI低代码破局:制造业数智转型落地实战
大数据·人工智能·低代码·制造
大大大大晴天10 小时前
每天认识一个组件:流式存储Apache Fluss
大数据
熊野君10 小时前
第 4 章 技术产品经理核心能力模型
大数据·人工智能·产品经理
财复视界11 小时前
光智科技从“光学元件”到“稀散金属材料平台”的进化逻辑
大数据·人工智能·科技