为什么我把 "alias" 作为别名的最后选择
文章探讨了使用脚本而非`alias`作为命令行别名的优缺点。作者认为脚本更胜一筹,因为它无需重新加载配置、支持多种编程语言、提供更大的灵活性和可移植性。虽然`alias`在特殊权限、条件定义、绕过和简洁性方面更具优势,且性能略高,但作者最终选择脚本作为默认方案,因为其带来的便利性更符合个人需求。
为什么我把 "alias" 作为别名的最后选择
作者:Evan Hahn,发布于 2025 年 3 月 5 日
别名是我在自定义 dotfiles 时最先添加的功能之一。例如,这是我早期定义的一个别名:
alias g=git
现在,我可以使用 g
代替 git
,这为我每天运行数十次的命令节省了一些时间!
# 这两个命令现在是等效的:
git status
g status
我过去常常使用 alias
来定义这些别名。毕竟……我定义的就是一个别名!
但随着时间的推移,我认为我发现了一种更好的方法:在我的 $PATH
中的脚本。
工作原理
在我的主目录中,我有一个名为 bin
的脚本文件夹。例如,这是一个简化版的 ~/bin/g
:
#!/usr/bin/env bash
exec git "$@"
运行此脚本基本上就是运行 git
。
我将此文件夹添加到我的 $PATH
中。(请参阅 Julia Evans 的关于如何执行此操作的指南。)在我的 .zshrc
中,我有一行这样的代码:
export PATH="$HOME/bin:$PATH"
现在,当我输入 g
时,它会运行该脚本。
这与别名的行为方式相同。和以前一样,g status
和 git status
是等效的。
# 这两个命令仍然相同:
git status
g status
这比 alias
冗长得多。那么 为什么要这样做呢?
脚本优于别名的优点
与使用 alias
相比,脚本有几个优点:
- 无需重新加载;更改会立即生效。 当我创建、更新或删除
alias
时,我必须重新加载我的.zshrc
。我通过打开一个新的终端选项卡或运行source ~/.zshrc
来做到这一点。但是使用脚本,我不必这样做!我可以直接编辑~/bin
中的文件,它们就可以立即使用。这使得迭代更容易。 - 可以选择编程语言。 我使用 Bash 来编写很多脚本,但不是全部。例如,我有一个名为
~/bin/note
的笔记脚本,我不想用 Bash 编写,所以我用 Python 编写了它。使用别名,我 必须 用 Zsh 编写。 - 更多的工作空间。 别名通常用于简单的事情,例如在键入
g
时运行git
。但是我在~/bin
中有一些稍微复杂的脚本。例如,~/bin/sleepybear
让我的电脑进入睡眠状态,这在 Linux 和 macOS 上有不同的逻辑。在脚本中编码该逻辑比在别名中更容易。(我也可以使用 shell 函数来做到这一点。) - 更具可移植性。 我通常使用 Zsh,但我 偶尔 使用 Bash,并且有兴趣再次尝试 Fish。如果我使用别名,我必须手动将内容移植到我的新 shell 中。使用
~/bin
目录,工作量要少得多:只需将其添加到我的$PATH
环境变量中即可。
这些优点足以说服我将脚本作为我的默认设置,即使对于像 g=git
这样的简单别名也是如此。
别名优于脚本的优点
脚本是我的首选,但它们并不完美。编程中的一切都有权衡!
关于 alias
,有几件事做得更好:
- 特殊权限。
alias
和 shell 函数具有脚本不具备的特殊权限。例如,我将cd..
别名为cd ..
,因为我经常输入错误。我还有一个 shell 函数boop
,它会根据前一个命令的退出状态发出声音。据我所知,shell 脚本无法做到这些。它无法更改外部进程的工作目录,并且它不知道其他进程的退出状态。如果使用脚本很难/不可能做到,我会退回到别名或 shell 函数。 - 条件定义。 与有条件地定义别名相比,有条件地定义
~/bin
中的文件更难。例如,我喜欢 macOS 自带的open
命令。在 Linux 上,它不存在,我使用alias
定义了一个别名。此别名在 macOS 上根本不存在,因为我有条件地定义了它。 - 更容易绕过。 我将
vim
别名为nvim
,但 偶尔 我想运行真正的 Vim。 Bash 和 Zsh 提供了几种绕过别名的方法;例如,我可以运行\vim
。使用$PATH
中的 shell 脚本,我无法做到这一点。绕过这些的唯一方法是使用完整路径,例如/usr/bin/vim
,暂时从我的$PATH
中删除~/bin
,或暂时移动整个脚本。 - 简洁。 当我创建一个新脚本时,我必须在
~/bin
中创建一个新文件,将#!/usr/bin/env bash
放在顶部,并使该文件可执行。这还不错,但键入alias g=git
会更快一些。(为了更容易做到这一点,我编写了一个名为mksh
的脚本,它可以做到这一点。) - 性能。 在我运行的一项非正式测试中,
alias
比脚本快 100 多倍。这是有道理的。计算机必须在磁盘上的$PATH
中找到一个文件,解析它并执行它——这比仅仅运行一个它可能存储在内存中的命令要慢。在实践中,我从未注意到这种性能差异,但如果我每秒运行数百次g
,也许我会注意到。
选择你喜欢的
最终,这个决定没有太大区别。两种方法(别名和脚本)非常相似。但对我来说,我默认使用脚本,因为我喜欢它们能做的事情。