4

根据Apple 的开发人员文档Library全局允许导入已编译的脚本,以便它们可以用作当前脚本中的库。myLibName.scpt如果您要执行以下代码之类的操作,则此方法很好用~/Library/Script Libraries

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

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

脚本成为脚本库的基本要求是它的位置:它必须是以下文件夹之一中“脚本库”文件夹中的脚本文档。搜索库时,按列出的顺序搜索位置,并使用第一个匹配的脚本:

  1. 如果引用该库的脚本是一个包,则该脚本的包资源目录。这意味着脚本可以与它们使用的库一起打包和分发。
  2. 如果运行脚本的应用程序是一个包,则应用程序的包资源目录。这意味着脚本应用程序(“applet”和“droplets”)可以与它们使用的库一起打包和分发。它还使运行脚本的应用程序能够提供供这些脚本使用的库。
  3. 在环境变量 OSA_LIBRARY_PATH 中指定的任何文件夹。这允许使用库而不将其安装在通常的位置之一。该变量的值是以冒号分隔的路径列表,例如 /opt/local/Script Libraries:/usr/local/Script Libraries。与其他库位置不同,OSA_LIBRARY_PATH 中指定的路径完全按原样使用,无需附加“脚本库”。在 OS X v10.11 及更高版本中受支持。
  4. 用户主目录 ~/Library 中的 Library 文件夹。这是安装库以供单个用户使用的位置,并且是库开发期间的推荐位置。
  5. 计算机库文件夹 /Library。位于此处的库可供计算机的所有用户使用。
  6. 网络库文件夹 /Network/Library。位于此处的库可供网络上的多台计算机使用。
  7. 系统库文件夹 /System/Library。这些是 OS X 提供的库。
  8. 任何已安装的应用程序包,位于应用程序的包库目录中。这允许分发与应用程序相关联的库,或创建仅用于分发库的应用程序。在 OS X v10.11 及更高版本中受支持。

问题是它不起作用。我尝试OSA_LIBRARY_PATH通过我的文件全局导出变量,然后通过脚本编辑器和可执行文件.zshrc运行一个示例脚本,就像上面的脚本一样。osascript没有任何作用;我收到“找不到文件”错误。我在网上找到了这个主题——参与者放弃希望的地方;它没有太多解释。有什么想法吗?

在一些相关的说明中,Scripting Additions套件提供了另外两种方法——loadScript而且storeScript——它们似乎在这里可能有用。不幸的是,当您尝试使用它们时,osascript会给您手指。不过,我确实设法从使用loadScript. 无论如何,你们可以对此发表的任何见解将不胜感激。谢谢。

4

2 回答 2

9

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

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

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

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

一旦你有了osascriptunrestricted ,你可以使用 OSA_LIBRARY_PATH 环境变量来运行它,如下所示:

OSA_LIBRARY_PATH="/path/to/libs" ./osascript path/to/script.scpt
于 2016-02-20T20:29:47.133 回答
2

作为一个糟糕的选择,您可以将符号链接放在 osascript 将查看的“脚本库”文件夹之一并将其指向您想要的文件夹。请注意,符号链接必须是整个文件夹的替代品,它不能只存在于其中。

rm -rf ~/Library/Script\ Libraries
ln -s "/Your/Custom/Path/Goes/Here/" ~/Library/Script\ Libraries

在 10.13.2 测试

于 2018-02-02T04:41:14.267 回答