更好的缩短 Linux 命令的方法(不是 alias)
Source: Dev.to
为什么别名不是缩短命令的最佳方式
如果你是新手 Linux 用户,可能会有一个 ~/.bash_aliases 文件,看起来像这样:
alias apup='sudo apt update'
alias apug='sudo apt upgrade'
alias apls='apt list'
alias apsr='apt search'
虽然别名可以方便地缩短冗长的命令,但它们也有几个缺点。
过多的别名会弄乱自动补全
在大多数 shell 中,按 Tab 键会显示自动补全建议。当很多别名共享相同前缀时,建议列表会变得嘈杂:
user@host:~$ ap
apls apsr
apt apug
apt-add-repository apup
apt-cache apt-get
aptitude apt-mark
别名无法在中间接受参数
别名只能在展开的命令之后接受参数。需要在中间插入参数的命令(例如 ffmpeg、magick)无法用别名有效缩短。
别名隐藏了命令的语法
alias gtad='git add .'
alias gtcm='git commit -m '
alias gtps='git push origin main'
这些快捷方式会阻碍你学习实际的命令结构。例如,gtad 不能添加指定的文件,所以在很多情况下你仍需输入完整命令。硬编码的参数(比如 MySQL 登录时的用户名)也会成为限制:
alias sql='sudo mysql -u root -p'
何时别名仍然有用
如果某个命令总是与相同的参数一起使用——比如登录 MySQL shell——可以保留一个简单的别名:
alias la='ls -A' # 已在许多默认的 ~/.bashrc 文件中出现
但对于需要灵活性的情况,建议使用包装脚本(wrapper script)代替。
使用包装脚本获得灵活性
包装脚本可以读取参数、执行逻辑,同时仍然提供简短的命令名。下面是一个为 Git 注入 token 到远程 URL 的示例:
#!/usr/bin/env bash
# Save this as ~/.local/bin/git (make sure ~/.local/bin is in $PATH)
if [[ $1 == "sync" ]]; then
# $2 should be /
/usr/bin/git remote set-url origin "https://$GIT_TOKEN@github.com/$2"
# add any additional steps here
else
/usr/bin/git "$@"
fi
- 在
~/.bashrc(或其他安全位置)中添加export GIT_TOKEN=your_token_here,使脚本能够获取 token。 - 将脚本命名为
git并放在$PATH中比/usr/bin更靠前的位置,这样它会覆盖系统的 Git 可执行文件,实现自定义行为,同时将其他所有命令委托给真实的 Git。
现在你可以这样运行:
git sync username/repo-name
相同的思路也适用于其他工具(例如 magick、yt-dlp),只需相应地调整参数解析逻辑。
如果想查看更多我的 Git 包装脚本,请点击这里。