Skip to content

Shell 与命令行工具

Shell 是把 Git、服务器、实验脚本和部署串起来的接口。先保证命令透明可读,再用补全、模糊搜索和别名减少重复输入。

Bash 与 Zsh

Bash 是服务器和脚本中最常见的默认选择;Zsh 更强调交互补全和可定制体验。项目脚本应显式声明解释器,不要假设所有机器都使用你的交互式 Shell。

bash
#!/usr/bin/env bash
set -euo pipefail

环境变量放在项目的 .env 示例或部署配置中,密钥只放受控的实际环境;不要把个人 PATH、别名和主题混进项目脚本。

Oh My Zsh

Oh My Zsh 管理 Zsh 的主题和插件。在 ~/.zshrc 中只启用真正使用的插件,数量过多会增加启动耗时和命令冲突。

zsh
plugins=(git sudo extract command-not-found web-search copyfile copypath)
source $ZSH/oh-my-zsh.sh

修改后用 exec zsh 重新加载。第三方插件通常要求先安装项目本体,再把插件放入 ~/.oh-my-zsh/custom/plugins/;以各项目当前安装说明为准。

Git plugin

Git 插件的别名以当前 Oh My Zsh 源码为准,升级后可能变化。高频别名如下:

别名展开用途
gstgit status查看状态
gaagit add --all暂存全部修改
gcmsggit commit -m带消息提交
gcogit checkout切换分支或路径
gswgit switch切换分支
gswcgit switch -c创建并切换分支
glgit pull拉取并合并
gpgit push推送
gpsupgit push --set-upstream origin $(git_current_branch)首次推送当前分支
gdgit diff查看未暂存差异
gdcagit diff --cached查看已暂存差异
glog图形化 git log查看提交图
gstagit stash push暂存工作区
gstpgit stash pop恢复最近 stash

别名能加速输入,但交接和文档中优先写完整命令,让不使用相同配置的人也能执行。

sudo plugin

按两次 Esc 可在当前命令前添加或移除 sudo。它只减少重输,不代表命令应以 root 身份运行;安装项目依赖、启动普通服务和修改用户文件通常不需要 sudo。

extract plugin

extract archive.tar.gz 根据扩展名选择解压命令,适合日常使用。处理来源不明的归档前先列出内容,避免路径穿越或覆盖文件。

command-not-found

当命令不存在时,它根据系统包索引建议安装包。建议只是线索:安装前核对软件包名、来源和系统版本。

web-search、copyfile 与 copypath

bash
google pytorch distributed checkpoint
copyfile pyproject.toml
copypath results/table.csv

web-search 在浏览器中打开搜索;copyfile 复制文件内容;copypath 复制绝对路径。复制密钥文件或包含隐私的数据前要确认剪贴板的去向。

zsh-autosuggestions

输入时会依据历史记录显示建议,通常用右箭头接受。历史中可能包含误输入和敏感参数,因此不要盲目接受;密钥应通过环境变量或标准输入传递,而不是直接出现在命令行。

zsh-syntax-highlighting

插件在执行前标记有效命令、路径和错误输入。它应当放在插件加载顺序的靠后位置,但颜色只是一层反馈,不能替代阅读即将执行的命令。

fzf

fzf 从标准输入读取候选并返回选择结果。Shell 集成通常提供:

快捷键作用
Ctrl-R模糊搜索历史命令
Ctrl-T搜索文件并插入路径
Alt-C搜索并进入目录

也可以组合任意命令:git branch --format='%(refname:short)' | fzf

fzf-tab

fzf-tab 接管 Zsh 的 Tab 补全展示。输入命令前缀后按 Tab,在候选中继续模糊搜索;若补全结果异常,先检查 Zsh 补全系统和插件加载顺序。

zoxide

zoxide 记录目录访问频率,用 z 关键词 跳转,用 zi 交互选择。刚安装时数据库为空,需要正常访问几次目录后才有明显效果。

bash
z research
zi
zoxide query research

The Fuck

上一条命令失败后运行 fuck,工具会给出修正候选。执行前必须阅读候选,尤其是涉及权限、删除、覆盖和远程资源的命令。项目当前处于何种维护状态也应在安装前查看官方仓库。

ripgrep、fd 与 jq

bash
rg -n 'TODO|FIXME' src tests
fd -e json . results
jq '.metrics.accuracy' results/run.json
jq -r '.items[] | [.name, .score] | @tsv' data.json

rg 搜内容,fd 找路径,jq 处理 JSON。它们可组合在脚本中,但复杂数据处理进入 Python 后通常更易测试。

curl 与 wget

curl 更适合 API 和单次请求,wget 更偏下载。调试 API 时用 -i 查看响应头,用 -f 让 HTTP 错误导致命令失败;不要把 Authorization Token 直接粘进会被保存的 Shell 历史。

bash
curl -fsS https://example.com/health
wget -c https://example.com/checkpoint.bin

参考:Oh My Zshfzfzoxideripgrepjq