如果您在 Mac 的终端中重复执行某条简短命令,别名可能就足够了。如果该任务需要参数、多个步骤、逻辑判断,或在交互式 shell 之外使用,请编写脚本。对于介于两者之间的情况——特别是需要参数但又应该更改当前 shell 目录的命令——可以考虑使用 zsh 函数。本指南可帮助您根据命令必须执行的操作以及需要在何处运行来做出选择。
别名在 macOS 上的作用
别名是一个简短的名称,zsh 会在您键入时将其展开为命令文本。例如,如果您经常运行 git status,可以将 alias gs='git status' 添加到 ~/.zshrc 中。Apple 文档指出 zsh 是终端的默认 shell,不过 Mac 的 shell 是可以更改的,因此如果别名的行为不符合预期,请检查您的配置。Apple 终端使用手册
当替换内容基本固定时,请使用别名:较短的拼写、标准选项或以交互方式运行的简单命令。它易于编辑或删除,并在您检查其定义时保持完整操作的可见性。在 zsh 中,别名不将参数作为参数传递;它们只是文本替换。这使得别名不适合在操作中需要传递路径或其他可变值的情况。Zsh 用户指南:别名
别名还与 shell 的解析和启动机制紧密相关。从 ~/.zshrc 加载的定义在交互式终端会话中很有用,但您不能假定其他程序、非交互式 shell 或脚本会读取该文件并识别该别名。如果该命令需要从不同上下文中可靠地调用,请使用脚本或其他显式命令接口。
何时脚本是更好的选择
当重复的任务是一个小型过程而不是固定命令时,请选择脚本。迹象包括:多个步骤、参数、检查、分支、明确的成功或失败行为,或者需要通过路径或从其他工具调用它。Apple 将 shell 脚本描述为一种组合命令行工具、处理参数并根据结果代码做出决策的方法。Shell 脚本也存在方言差异,因此请选择并注明解释器,而不是假定每个 shell 都能读取相同的语法。Apple Shell 脚本入门指南
例如,如果一个例程将项目文件夹作为输入,检查其是否存在,然后在此处运行相同的序列,则脚本可以使该输入明确,并将步骤排列为可读的顺序。在自动执行诸如删除或覆盖文件之类的更改之前,请添加检查并明确失败时的行为。Shell 脚本在其自身的执行上下文中作为命令运行;不能依赖在其内部更改目录来更改调用它的终端 shell 的目录。Zsh 文档中将脚本命令的执行与调用 shell 中的函数执行分别进行了说明。Zsh 命令执行
脚本并不会自动变得更安全或更具可移植性。它是另一个需要维护的文件,其行为取决于其解释器、Mac 上可用的命令、权限以及关于路径或输入的假设。Apple 的入门指南特别告诫,shell 方言和平台实用工具的差异可能会导致执行失败。保持脚本功能专一,在适当的地方对变量展开加上引号,并在对重要数据使用之前先用安全的样本输入对其进行测试。
针对折中情况使用 zsh 函数
如果您在当前的终端 shell 中需要可复用的逻辑和参数,但不需要独立的文件,函数通常是最佳选择。例如,函数可以接受一个目录参数,验证它,然后 cd 进入该目录;由于 zsh 函数在调用方的 shell 进程中运行,因此该目录更改会在交互式会话中保留。Zsh 文档指出,函数接收参数并在与调用方相同的进程中执行。Zsh 函数
当您希望函数在交互式终端会话中可用时,请在 ~/.zshrc 中定义它。当操作应作为独立命令运行、由工具或其他脚本调用,或者作为文件更容易共享时,应优先选择脚本。当您只需要为一个固定的命令行提供一个好记的名称时,应优先选择别名。
快速决策测试
问问自己,如果再次运行该任务,会有什么发生变化。如果除了命令名称之外没有任何变化,请使用别名。如果每次都有值发生变化(例如文件夹或文件名),请使用接受该值的函数或脚本。如果任务有多个步骤或判断逻辑,请使用脚本。如果它必须更改当前终端会话(例如其工作目录),请使用函数。
然后检查您需要在哪里使用该命令。仅限终端?~/.zshrc 中的别名或函数可能就合适。作为可单独调用的命令?请使用脚本,并配置合适的解释器和明确的权限。要与其他 Mac 共享?请注明相关假设和所需工具;仅仅因为 shell 脚本可以在终端中运行,并不意味着它就具有自动的可移植性。
实用的分界线在于任务的接口形式:别名重命名固定命令文本,函数在当前 shell 内部添加可复用的行为,而脚本将一个过程封装为独立命令。从满足这些需求的最简单选项开始,当参数、逻辑或命令必须运行的环境导致别名变得棘手或不适用时,再转向使用函数或脚本。
来源
在 Mac 上的“终端”中更改默认 Shell — Apple 支持
Z-Shell 用户指南:别名 — Zsh
Shell 脚本入门指南:简介 — Apple 开发者
命令执行 — Zsh
函数 — Zsh