根据 Apple's Developer Docs Library 全局允许导入已编译的脚本,因此它们可以用作当前脚本中的库。如果您要使用位于 myLibName.scpt~/Library/Script Libraries 执行类似以下代码的操作,这将很好用:

myLib = Library('myLibName');
myLib.myLibMethod() // Works just fine

但是,文档还声称可以导出一个环境变量 - OSA_LIBRARY_PATH 包含一串 : 分隔路径 - 然后 Library() 将遵循该路径列表,然后再继续其默认路径: ~/Library/Script Libraries 。你知道,比如 bash 环境变量 Path 。这是下面的相关文档;它描述了路径层次结构:



问题是它不起作用。我已经尝试导出 OSA_LIBRARY_PATH 变量——通过我的 .zshrc 文件全局导出——然后通过脚本编辑器和 osascript 可执行文件运行一个与上面类似的示例脚本。没有任何效果;我收到“找不到文件”错误。我在网上找到了这个 thread-where-the-participants-give-up-hope;它没有解释太多。有什么想法吗?

有一点相关, Scripting Additions 套件提供了另外两种方法——loadScriptstoreScript——它们似乎在这里很有用。不幸的是,当您尝试使用它们时,osascript 会为您提供帮助。不过,我确实设法使用 loadScript 从编译脚本中返回了看起来像十六进制缓冲区的内容。无论如何,你们可以对此提出任何见解,我们将不胜感激。谢谢。

最佳答案

在启用系统完整性保护的情况下运行时,受限制的可执行文件会忽略 OSA_LIBRARY_PATH 环境变量。

要解决此限制,您可以 turn off SIP ,也可以使用不受限制的可执行文件。

例如,要使 osascript 不受限制,您应该首先制作一个副本,然后使用临时签名重新签名:

cp /usr/bin/osascript ./osascript
codesign -f -s - ./osascript

获得不受限制的 osascript 后,您可以使用 OSA_LIBRARY_PATH 环境变量集运行它,如下所示:
OSA_LIBRARY_PATH="/path/to/libs" ./osascript path/to/script.scpt

关于objective-c - 为什么 OSA_LIBRARY_PATH 不能按照 JXA 的文档工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35389058/

10-11 22:21
查看更多