本文由 简悦 SimpRead 转码,原文地址 scriptingosx.com
在本系列文章中,我将探讨在 macOS 上启动脚本的多种方法。在 p......
在本系列文章中,我将探讨在 macOS 上启动脚本的多种方法。在 上一篇,开篇文章 中,我介绍了从交互式终端 shell 启动脚本时会发生的情况。
macOS 上有几款虚拟终端应用程序。iTerm 非常流行。一些文本编辑器,如 Visual Studio Code 和 Nova 也内置了终端。由于可执行文件的实际启动是由虚拟终端内运行的 shell 完成的,因此启动过程保持不变。
不过,终端应用程序有一个实用的小窍门。
命令 "文件扩展名
将脚本的文件扩展名改为".command "后,双击该文件将在新的终端窗口中打开并运行。脚本所需的任何输入或输出都将在该终端窗口中进行。脚本退出时,终端窗口中的 shell 会话也会退出。
让我们来看看这个简单的脚本:
#!/bin/sh
echo "Enter your name: "
read -r username
echo "Hello, $username"
将这个命令放入一个 .command 文件,然后双击它,就会出现一个新的终端窗口:
/Users/armin/Desktop/hello_name.command ; exit;
~ % /Users/armin/Desktop/hello_name.command ; exit;
Enter your name:
您可以看到终端打开了一个新窗口,其中包含一个新的默认 shell 和您的所有配置,然后立即启动脚本。脚本会打印输出,然后等待用户输入("read "命令)。当你在提示符下输入名称时,脚本继续运行。
Armin
Hello, Armin
Saving session...completed.
[Process completed]
脚本结束时,终端窗口中的 shell 也会退出。将不再显示交互式提示。
该脚本希望用户在终端中输入,然后在同一窗口中将输出显示为 stdout。虽然你可以重新编写脚本,使用 AppleScript 的 "display dialog" 同时处理输入和输出,但这会使脚本复杂得多。
相反,你可以将文件扩展名改为".command",然后双击就能创建一个新的终端窗口,在此进行用户交互(输入和输出)。对于合适的用户和工作流程,这可能是一个充分的解决方案,几乎没有任何开销。
你也可以完全删除文件扩展名。在 Finder 中双击此类文件时的行为将保持不变。没有扩展名的可执行文件也会有一个不同的图标。无论采用哪种方式,都需要为脚本设置可执行位。
注意:iTerm 也可以打开 .command 文件,但在这种情况下,用户交互会遇到一些问题。因为我通常不用 iTerm,也许是我的设置出了问题?
隔离区和GateKeeper
终端窗口不是很多用户都喜欢的用户界面,但它可以让你以其他用户能理解的形式与他们共享脚本。"双击运行 "符合大多数用户对 macOS 工作方式的理解。
在你开始创建数十个".command "脚本并与他人共享之前,macOS 安全系统设置了一个重要的绊网。
当你通过网站、电子邮件或聊天信息共享可执行文件时,macOS 会附加一个隔离标记。对于应用程序,该标记会触发应用程序启动前的 GateKeeper 扫描,即使应用程序已签名并经过公证,它也会显示标准对话框;如果没有签名和公证,则会显示更 "吓人 "的警告。
从终端直接或间接双击启动命令或脚本时,如果仍然设置了隔离标记,则无法启动。你不会看到标准的 Gatekeeper 对话框。只会在终端输出中出现一个不透明的 "不允许操作 "错误。
你可以使用 xattr 命令检查文件是否设置了隔离标志:
> xattr hello_name.command
com.apple.TextEncoding
com.apple.lastuseddate#PS
com.apple.quarantine
您的扩展属性列表可能有所不同。隔离标志的标签为 com.apple.quarantine。
xattr 命令也可以删除隔离标记:
> xattr -d com.apple.quarantine hello_name.command
Apple 似乎认为,当你使用终端时,你知道自己在做什么。这意味着你可以绕过大多数使用命令行工具附加隔离标志的机制。当你用 curl 下载东西时,它不会被隔离。你可以使用 installer 命令安装未签名、未公证的 pkg 安装程序。虽然这是可能的,但并不意味着它总是 明智的。将 curl 命令直接移植到 sh 或 bash 或任何解释器中,安全性仍然很差。
不过在大多数情况下,共享给其他 Mac 或其他用户的脚本文件几乎肯定会获得隔离标记。善于使用终端的用户应该可以使用 xattr 命令来禁用这种保护,但这并不适合 "普通 "用户。因此,"隔离 "使得使用命令文件扩展名的效果大打折扣。这可能是有意为之,因为双击打开的可执行文件很容易利用用户的无知将恶意软件和其他不需要的软件偷偷植入系统。
当你在 macOS 系统之间移动脚本和可执行文件时,通常会出现这种情况。我还见过在云同步服务(尤其是 iCloud)中存储脚本或使用沙盒应用程序编辑可执行文件时设置隔离标记的情况。
绕过隔离区的一种方法是分发脚本并用安装包正确安装。然后,你可以对安装程序 pkg 进行适当的签名和公证,脚本就不会被隔离,因为它们来自可信和经过验证的来源。对于某些工作流程来说,这可能是一个不错的解决方案,但总体感觉有点 "设计过度"。
输出快速闪过
在终端的偏好设置中,有一项设置可以决定退出 shell 时窗口会发生什么。你可以在 "配置文件 "区域的 "Shell "选项卡下找到它。每个配置文件的设置可能不同。在 "当 shell 退出时 "下有一个弹出式菜单,其中有 "关闭窗口"、"如果 shell 干净退出则关闭 "和 "不关闭窗口 "选项。最后一项 "不关闭 "是默认选项。
将该选项设置为 "关闭窗口 "时,命令文件中的新终端窗口可能只会激活并在短时间内可见。这可能是好事,也可能不是好事,这取决于你想要什么。
结论
以命令文件为扩展名的脚本文件是一种简单、直接的方法,可以让脚本轻松地从 Finder 中 "启动"。你还可以将它们放在 Dock 或登录项中。用户体验是,嗯,一个终端,所以不是非常好,但它可能是有用的,而且不需要对脚本进行任何修改。
当你共享可执行脚本时,无论它们是否有命令文件扩展名,macOS 上的 Gatekeeper 隔离功能都能阻止脚本运行。你应该熟悉隔离标志和 xattr 命令来操作它。
在下一篇文章中,我们将从 AppleScripts 启动 shell 脚本。]