若要检查 Shell 脚本在 Mac 快捷指令中是否运行成功,请在脚本运行后立即捕获其退出状态,并将该数字作为文本传回。在快捷指令中,添加运行 Shell 脚本操作,然后使用如果操作根据返回的值进行分支判断:按照 Shell 惯例,0 表示成功;非零值则表示错误或其他未成功的结果。这种方法可以让状态明确呈现,而无需假定快捷指令会公开单独的状态变量。

添加 Shell 操作并捕获状态

在 Mac 上的“快捷指令” App 中打开相应快捷指令。在操作库中搜索运行 Shell 脚本并将其添加。Apple 将 Shell 脚本操作描述为 Mac 快捷指令生态系统的一部分,不过《快捷指令使用手册》并未记录该操作的所有设置或版本细节。如果操作库中没有该操作,请勿用 Automator 中名称类似的操作替代并假设其行为完全相同;请检查 Mac 上实际可用的操作。Apple 的快捷指令概览

在脚本字段中,将脚本命令放在一行,然后紧接着在下一行捕获 $?。例如,如果脚本可执行且位于下方所示的示例路径中:

/Users/yourname/Scripts/refresh-files.sh >/dev/null
script_status=$?
printf '%s' "$script_status"

将示例路径替换为您脚本的实际路径。该重定向会将脚本的标准输出发送至 /dev/null,因此操作的文本输出仅包含状态码数字。如果您也需要脚本的输出,请移除 >/dev/null,但这样返回的文本可能同时包含该输出和状态。标准错误不会被此重定向屏蔽。

$? 保存了最近完成的命令的退出状态。这就是为什么必须紧随脚本调用之后进行赋值:如果先运行了其他命令,$? 将转而表示该命令的状态。随后,printf 会将保存的数字作为文本输出,快捷指令可将其用作操作输出。Apple 的 Mac Shell 脚本工作流程指南

根据返回的数字进行分支

在运行 Shell 脚本之后添加一个如果操作。将其输入设置为该 Shell 操作的输出,选择文本条件是,然后输入 0。将成功时执行的操作放在如果下方,将任何失败处理放在否则下方。Mac 快捷指令中的“如果”操作会根据您配置的条件将内容导向两条路径之一。Apple 的 Mac 快捷指令“如果”操作指南

请将结果作为文本处理,因为 Shell 操作输出的是文本。成功运行应返回 0;非零结果则应走另一条分支。您可以在失败分支中放置一个显示提醒操作,并在其消息中包含该状态值,或者将该值传递给后续操作进行日志记录。Shell 脚本通常使用不同的非零值来区分失败原因,因此保留该数字有助于排查问题。

避免常见的状态检查错误

不要在后续操作中添加 echo $? 并期望它能指代先前的 Shell 进程。每个 Shell 操作都会启动自己的命令执行过程;$? 仅在同一 Shell 运行内部,且紧跟在所需状态的命令之后时才有意义。同样,在脚本运行之前输出状态,只会输出此前运行的任何内容的结果。

如果脚本执行了多条命令,其最终的退出状态可能取决于脚本的编写方式。例如,后续成功的命令可能会掩盖早先的失败,除非脚本特意传递或处理了该失败。快捷指令只能根据脚本最终返回的状态进行分支。如果结果未能反映您关注的步骤,请检查脚本自身的错误处理。

从终端运行快捷指令时

如果您的目标是从终端检查整个快捷指令是否运行成功,Apple 记录了一个单独的 shortcuts 命令:shortcuts run "Shortcut Name"。当快捷指令运行成功时,该命令退出码为 0,出错时为 1。这是快捷指令调用本身的状态,而不是包含内部 Shell 操作退出代码的专用变量。若要在快捷指令分支中使用脚本自身的状态,请如上所述在 Shell 操作内部捕获并输出它。Apple 的 Mac 快捷指令命令行指南

实际的操作模式很简单:运行脚本,立即保存 $?,输出该保存的值,并在“如果”操作中将生成的文本与 0 进行比较。这样就为 Mac 快捷指令提供了明确的成功路径和失败路径,同时确保决策逻辑与脚本的实际退出结果紧密关联。

参考来源