Omarchy Shell Functions 完全指南:从压缩归档到 AI 开发布局的自动化命令集
Omarchy Shell Functions 完全指南从压缩归档到 AI 开发布局的自动化命令集【免费下载链接】omarchyBeautiful, Modern Opinionated Linux项目地址: https://gitcode.com/GitHub_Trending/om/omarchy本文聚焦 Omarchy Linux 发行版内置于 Bash 环境中的一套 shell 函数集讲解其分类、用法、底层实现与适用场景。这套函数统一存放在 default/bash/fns/ 目录下覆盖压缩、磁盘格式化、tmux/Herdr 多窗格开发布局、Git worktree 管理、rsync 文件监听同步、SSH 端口转发与 SSH 断线自动重连等高频操作。读完本文你将能熟练调用这些命令理解其封装思路并能在自己的开发流程中直接复用它们。函数的组织与加载方式Omarchy 的 shell 函数并不零散地散落在各处而是按领域拆分为独立文件统一由 Bash 启动时加载。加载入口位于 default/bash/functions其实现只有一行核心逻辑for f in $OMARCHY_PATH/default/bash/fns/*; do source $f; done即遍历fns目录下所有文件并逐一source。目录中目前包含 8 个主题文件与下文的分类一一对应compression压缩与解压drives写 ISO 到 SD 卡、整盘格式化为 exFATtmuxtmux 下的多窗格开发布局herdrHerdr 下的同款布局worktreesGit worktree 的创建与清理rsyncing基于 inotify 的 rsync 自动同步ssh-port-forwardingSSH 本地端口转发ssh-reconnectSSH 断线自动重连。这套函数的设计初衷是简化常见任务并封装复杂的参数调用把需要记忆多参数组合的操作收敛成单一、有语义的命令。压缩compress/decompress压缩相关命令是目录下最简单的一组。default/bash/fns/compression 的全部实现如下compress() { tar -czf ${1%/}.tar.gz ${1%/}; } alias decompresstar -xzfcompress [file/dir]把文件或目录打成tar.gz归档。实现细节值得注意${1%/}负责去掉路径末尾的斜杠避免产生类似dir/.tar.gz这样的多余文件名输出的归档与源对象同名、仅追加.tar.gz后缀。目录会递归打包tar -c配合-zgzip 压缩。decompress [file.tar.gz]本质是tar -xzf的别名在当前目录展开归档内容无需手工记忆-xzf三个标志的组合。这是最典型的封装繁复参数示例tar -czf/tar -xzf的组合参数被收敛为两个可记忆的动词。磁盘与可启动介质iso2sd/format-drive这两个命令属于高风险操作源码中对参数校验、交互确认与用户提示都做了较多处理完整实现见 default/bash/fns/drives。iso2sd [image.iso] [device]把 ISO 镜像写入 SD 卡 / 可移动磁盘做成可启动介质。命令支持两种用法只给一个参数iso2sd ~/Downloads/ubuntu.iso。函数会用lsblk -dpno NAME | grep -E /dev/sd枚举系统中的 SD 类块设备并调用交互式选择器omarchy-drive-select让用户挑选目标盘直接指定设备iso2sd ~/Downloads/ubuntu.iso /dev/sda。底层写入使用sudo dd bs4M statusprogress oflagsync if$iso of$drive sudo eject $drive写入结束后会自动eject弹出介质。源码中还包含完整的守卫逻辑无参数时打印 Usage 与示例没有发现任何 SD 设备且未指定设备时报错退出交互选择被取消时安全返回。可执行命令以sudo运行需要管理员权限。format-drive [device] [name]把整块磁盘重新格式化为单一 exFAT 分区exFAT 是 Windows、macOS 与 Linux 三者都能原生读写的主流格式因此非常适合制作跨平台交换盘。不带参数运行format-drive会打印 Usage 并列出所有可用设备Usage: format-drive device name Example: format-drive /dev/sda My Stuff Available drives:正式调用时源码会先打印警告并等待y/N交互确认echo WARNING: This will completely erase all data on $1 and label it $2. read -rp Are you sure you want to continue? (y/N): confirm确认后依次执行wipefs -a抹除磁盘上的全部文件系统签名dd if/dev/zero bs1M count100覆盖磁盘头部区域parted建立 GPT 分区表并创建1MiB → 100%的主分区同时设置msftdata标志以利于 Windows 识别根据设备名推断分区节点NVMe 磁盘形如/dev/nvme0n1分区追加p1即${1}p1普通磁盘则追加1即${1}1partprobe/udevadm settle让内核重读分区表mkfs.exfat -n $name用指定卷标创建 exFAT 文件系统。该函数把上面这一整条危险且冗长的命令链压缩成一条带确认保护的命令强烈建议先不带参数查看设备清单、确认目标盘无误再执行。Dev 布局tmux 与 Herdr 的多窗格一键编排这是整套函数集中最重头、也最能体现 Omarchy为 AI 辅助开发而设计理念的部分。它的目标是一条命令在当前目录立刻拼出一个包含编辑器 AI Agent 终端的开发工作区。背景$EDITOR、AI 别名与编辑器即工作区Omarchy 的编辑体验以 Neovim$EDITOR为核心AI Agent 通过别名调用c代表 opencodecx代表 Claude Code也可直接传入codex或其他 Agent 名。布局函数会自动在对应窗格执行$EDITOR .打开当前目录与 Agent 启动命令。tmux 一族tdl/tds/tdlm/tsltmux 版本实现见 default/bash/fns/tmux。几个要点如下tdl [ai] [second_ai]—— Tmux Dev Layout编辑器 AI 终端三窗格前提必须在 tmux 会话内运行源码通过[[ -z $TMUX ]]检查否则提示You must start tmux to use tdl.复用当前窗格$TMUX_PANE作为编辑器窗格并把窗口重命名为当前目录名basename $current_dir先垂直切出底部 15% 作为通用终端tmux split-window -v -p 15再水平切出右侧 30% 作为 AI 窗格tmux split-window -h -p 30若传了第二个 Agent如tdl c cx则在 AI 窗格内再垂直切分并直接启动第二个 Agent自动向各窗格发送启动命令nvim .在左、Agent 在右。tds—— Tmux Dev Square四宫格布局是tdl的强化版编辑器 hunk diff --watch差异监听 通用终端 opencode。四个窗格通过 50% 比例的连续切分拼成各窗格分别运行nvim . # 编辑器 hunk diff --watch # 实时差异监视 opencode # AI Agent # 剩余一个窗格保留为普通 shell 终端tdlm [ai] [second_ai]—— 对当前目录下每一个子目录各建一个tdl窗口特别适合多仓库 / monorepo 场景。源码会先把会话重命名为当前目录名目录名中的.与:被替换为-规避 tmux 的命名限制随后遍历子目录第一个子目录复用当前窗口其余每个子目录各开一个new-window窗口内自动执行cd 子目录 tdl ai。tsl [count] [command]—— 生成一个窗格蜂群swarm用count个窗格平铺成网格每个窗格运行同一条命令。实现上逐个水平切分再用tmux select-layout tiled让 tmux 自动平铺。源码注释明确说这非常适合 AI Agent 并行——例如一次开 6 个窗格同时跑同一个 Agent 任务。Herdr 一族hdl/hds/hdlm/hsl同样的布局逻辑在 Herdr 下也有等价实现见 default/bash/fns/herdr。区别在于环境检查从$TMUX变为$HERDR_PANE_ID底层通过 Herdr CLI 完成操作herdr pane split切分返回新 pane 的 JSON再用jq -r .result.pane.pane_id解析、herdr tab rename、herdr pane run布局命名对应hdl tdl、hds tds、hdlm tdlm、hsl tsl。值得留意的是hsl与tsl的网格算法不同hsl不依赖布局器自动平铺而是自行计算ceil(sqrt(count))个列、再把行数均摊到各列通过_herdr_split与_herdr_ratio用awk计算浮点切分比例逐列切出等分网格——从源码注释看这是为了保持 pane 数组自左向右、自上而下的稳定顺序。两个多路复用器的共同工程技巧对比 tmux 与 herdr 两份实现可以看到一组被刻意贯彻的技巧以当前 pane 的环境变量$TMUX_PANE/$HERDR_PANE_ID作为编辑器锚点而不是依赖当前焦点——这样即使用户中途切换焦点也不会切错窗格切分后立即用-P -F #{pane_id}tmux或 JSON 解析herdr捕获新窗格的真实 ID为后续精确发送命令做准备窗口/标签/工作区一律重命名为目录名多项目同时打开时一眼可辨。Git Worktreega/gd这一组把 Git 的 linked worktree 操作收敛成进入即建、退出即删的配对命令实现见 default/bash/fns/worktrees。ga [branch]—— 在当前仓库旁边新建一个 worktree 并跳转进去git worktree add -b $branch $wt_path mise trust $wt_path # 信任该目录下的 .mise.toml cd $wt_pathworktree 路径约定为上一级目录下的${当前目录名}--${分支名}例如在~/Work/app里执行ga feature-x会得到~/Work/app--feature-x。--是刻意引入的分隔符供gd反向解析。新建后自动执行mise trust以信任项目本地工具链配置最后cd进入新 worktree。gd—— 在 worktree 内执行安全地拆除当前 worktree 与其分支先通过gum confirm弹交互确认用pwd的 basename 按首个--拆出根目录名与分支名防御性检查若名字里没有--说明当前目录并非 worktree 命名约定产生的目录函数拒绝执行避免误删正常开发目录确认无误后切回根仓库执行git worktree remove --force与git branch -D。配合ga/gd使用可以快速在一堆独立分支间并行工作而不污染彼此的 checkout。Rsync 自动同步rsw/lsw/dsw这一组用inotifywait实现变化即同步的文件监听器核心应用场景是本地开发、远程如开发机、服务器运行的代码同步实现见 default/bash/fns/rsyncing。rsw [source] [destination]—— 启动一个后台 watcher先做一次全量rsync -a随后while inotifywait -r -q -e modify,create,delete,move持续监听目录事件任一变化触发增量同步setsid --fork env RSYNC_RSH$rsh bash -c rsync -a $1/ $2; while inotifywait -r -q -e modify,create,delete,move $1; do rsync -a $1/ $2; done ...其中两个细节极具实战价值setsid --fork使 watcher 脱离当前 shell 进程组关闭终端也不会连带终止当目标为远程主机如rsw ~/Work/app nyc-dev:Work/app时函数自动构造 SSHControlMasterautoControlPersistyes的控制套接字让每次同步复用同一条 SSH 连接。源码注释明确写到这是为了让 1Password SSH agent 只弹一次验证。rshssh -o ControlMasterauto -o ControlPath$sockets/rsw-%r%h:%p -o ControlPersistyes控制套接字统一放在$XDG_RUNTIME_DIR回退到~/.ssh/sockets。lsw—— 通过pgrep -af rsw-watch 列出所有活跃 watcher 的 PID 与源 - 目标映射。dsw—— 结束所有活跃 watcher遍历匹配进程并向其进程组发送信号kill -- -$pid连同 inotifywait 子进程一并终止。SSH 本地端口转发fip/dip/lip这组函数解决一个非常具体的 Web 开发痛点浏览器把localhost视为安全上下文secure context可直接测试 WebSocket、Camera 等特性而通过 IP 访问开发机则没有这些特权。用fip把远程端口转回localhost即可在本地用安全上下文开发远程服务且无需配置 SSL 证书。实现见 default/bash/fns/ssh-port-forwarding。fip [host] [port1] [port2] ...—— 支持一次转发多个端口ssh -f -N -L ${port}:localhost:${port} $host例如在远程机器nyc-dev上把 dev server 起在3000本地执行fip nyc-dev 3000之后访问localhost:3000实际到达nyc-dev:3000。-f让 ssh 转入后台、-N表示不执行远程命令、-L完成本地转发。dip [port1] [port2] ...—— 断开指定端口的转发按ssh.*-L ${port}:localhost:${port}模式匹配并pkill。lip—— 列出所有活跃转发pgrep -af ssh.*-L [0-9]:localhost:[0-9]无活跃项时输出No active forwards。SSH 断线自动重连的封装最后这一组是整套函数中工程复杂度最高的一块。default/bash/fns/ssh-reconnect 将ssh本身包装为一个同名 shell 函数函数内通过command ssh调用真正的二进制核心目标是解决两类问题终端被远程程序劫持后的残骸清理远程 tmux、Herdr、编辑器会在 SSH 管道上打开鼠标追踪1000/1002/1003、1006 编码、焦点上报1004与备用屏幕1049等终端模式。如果连接是异常死亡而非正常退出这些模式不会被对方解除本地终端会残留转义垃圾——之后每次鼠标移动都会向提示符灌入转义序列。ssh函数在每次退出后都会调用_ssh_disarm主动发送退出手动模式与恢复光标的序列printf \e[?1000l\e[?1002l\e[?1003l\e[?1006l\e[?1004l\e[?1049l\e[?25h交互会话断线自动重连。函数仅当满足全部条件才进入重连循环退出码为 255SSH 传输层失败的标准码、标准输入是 TTY、这是一次交互式会话、且本次连接至少已存活 30 秒。这些条件的意义源码注释有详细说明连接/认证失败虽然也返回 255但通常是快速失败需要直接退出而非无限重试远程执行的普通命令若自身返回 255不能因为重连而重复执行其副作用标准输入被重定向时重连会把管道剩余输入灌给新的远程 shell必须禁止。_ssh_interactive用于判断是否为目标主机 无远程命令的交互式连接。它解析 ssh 参数知道哪些字母选项会消费下一个参数值选项集合BbcDEeFIiJLlmOoPpQRSWw如-p 2222、-o ...从而把真正的 destination 找出来随后用ssh -G解析有效配置确认不存在会随重连自动回放的RemoteCommand解析失败时按 fail-closed 处理。重连循环运行在子 shell中并每 2 秒重试一次因为 Ctrl-C 会送达整个前台进程组放在子 shell 里能同时取消正在进行的连接尝试与重试循环本身用户按一次 Ctrl-C 即可彻底停止。快速失败也持续重试因为服务器正在重启期间同样会拒绝连接——这与真实的重启场景完全吻合。在 Omarchy 之外复用这套函数虽然本仓库是 Omarchy 的发行配置函数随系统默认 Bash 环境加载并依赖部分 Omarchy 特有命令如omarchy-drive-select、gum、hunk、mise、herdr但其中的设计思想可以低成本迁移到任何 Linux Bash tmux 环境compression、ssh-port-forwarding、worktrees 依赖面最小几乎可直接抄用rsw需要inotifywaitinotify-tools是主流发行版都有的软件包tdl/tds/tsl只需 tmux 与$EDITORHerdr 一族则要求安装 herdr。想完整理解这套函数的上下文可继续阅读 default/bash/aliases别名与 AI 调用约定、default/bash/functions加载机制以及配套的 manual/21-tuis.md 与 manual/19-shell-tools.md 手册章节函数对应文档见 manual/20-shell-functions.md。核心源码集中于 default/bash/fns/全部为约 300 行以内的可读 Bash是学习面向 AI 工作流设计终端工具的优秀参考实现。【免费下载链接】omarchyBeautiful, Modern Opinionated Linux项目地址: https://gitcode.com/GitHub_Trending/om/omarchy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考