【问题标题】:AppleScript: execution error -10810 when launching certain applications from shebang'ed scriptsAppleScript:从 shebang 脚本启动某些应用程序时执行错误 -10810
【发布时间】:2015-04-14 03:13:27
【问题描述】:

我正在运行 OS X 10.10.2。我面临一个奇怪的问题,AppleScript 不会从 shebang'ed 脚本启动应用程序,而在其他任何地方都可以正常工作(脚本编辑器,管道到 osascript 等)。具体来说,请考虑以下名为 launch-app 的示例脚本:

#!/usr/bin/osascript
launch application "TextEdit"

当 TextEdit 没有运行而我运行时

./launch-app

我明白了

./launch-app:0:29: execution error: An error of type -10810 has occurred. (-10810)

当我这样做时

<launch-app osascript

嗯,它工作得很好;这意味着以下 Bash 脚本也可以工作:

#!/usr/bin/env bash
osascript <<EOF
launch application "TextEdit"
EOF

真的很奇怪。 (顺便说一句,tell ... activate ... end tell 块会导致相同的错误。我在这里使用launch 只是为了保持示例的最小化。)

我有一些涉及激活应用程序的旧脚本(嗯,实际上我所有的旧脚本都涉及tell ... activate ... end tell),这些脚本在过去确实有效。我不知道什么时候开始分崩离析,因为当我运行这些脚本时,activate 的应用程序通常已经启动。我的印象是这个问题至少可以追溯到 10.10.1。

我在 SO 上查看了几个相关的帖子,例如,this one,但它们没有帮助。我还尝试通过阅读 this one 之类的文章来理解错误 -10810,但我的问题绝对不像一个填充的进程表(否则为什么在从 shebang 运行 osascript 时直接调用 osascript 不起作用?)。

【问题讨论】:

  • 您是否在不同的机器上尝试过(运行相同的操作系统版本)?该脚本看起来不错(它在我的 OSX 10.10.2 机器上运行良好)。
  • @mklement0 好点。控制台日志显示“1/30/15 2:05:42.421 PM TextEdit[21620]:应用程序包中没有 Info.plist 文件或 Info.plist 文件中没有 NSPrincipalClass,正在退出”。不知道这怎么可能,特别是考虑到该脚本适用于所有其他调用方式。
  • @mklement0 嗯,我没有意识到即使do shell script 也不起作用。我已经向 Apple 提交了错误报告。顺便说一句,我刚刚在 10.8.5 上测试了同样的东西,正如预期的那样,它只是定义了。我手头没有 10.9 环境。
  • @mklement0 标准输入有效,文件无效...
  • 好消息:问题终于在 10.10.*3* 得到解决。

标签: applescript


【解决方案1】:

更新:该错误已在 OSX 10.10.3修复


只是为了提供一个工会状态的帖子:

观察到的行为是 OSX 10.10 中的一个错误,截至 OSX 10.10.2(截至 2015 年 3 月 10 日)仍未解决:

任何有兴趣修复此问题的人都应该在http://bugreport.apple.com 提交自己的错误。

它适用于直接或间接传递给osascript可执行脚本 - 是否:

  • 明确表示 (osascript launch-app)
  • 或通过shebang行直接调用(./launch-app)

shebang行的具体形式无关(#!/usr/bin/osascript#!/usr/bin/env osascript#!/usr/bin/env osascript -l JavaScript或...),重要的是文件是否设置了可执行位(权限)(例如,通过chmod +x)。

解决方法

  • 按照 OP 的建议,将文件通过 stdin 提供给 osascriptosascript &lt; launch-app

    • 这有副作用;例如,name of me 将报告 msng 而不是脚本的名称。
  • 从脚本中移除可执行位并使用osascript显式调用它

    • chmod -x launch-app # a one-time operation
    • osascript launch-app # with the executable bit unset, this should work

【讨论】:

  • 我已经提交了一份。不过我没有在 OpenRadar 中归档。
  • @zmwangx:我没有使用 OpenRadar 的经验——你认为这值得吗? (P.S.:我知道你这样做了;我也是。目的是鼓励其他人也提交错误报告。)
  • 这只是分享您提交的错误的好方法,以便其他人可以搜索并发现他们并不孤单 - 您向 Apple 提交的错误是机密的 AFAIK。
  • @zmwangx:知道了。瞧:openradar.me/radar?id=5864388946821120(报告基本上只是指向这里)。
【解决方案2】:

查看 osascript 的手册页,当您发送几行 applescript 代码时,您应该将“-e”选项放在每行的前面。

这就是我测试的内容。我用 -e 选项制作了一个 bash 脚本...

#!/bin/bash
osascript -e 'launch application "TextEdit"'

一个没有。

#!/bin/bash
osascript 'launch application "TextEdit"'

没有 -e 选项的不运行。因此,我认为这可能是您的问题的原因...您的代码中没有 -e 选项。

请注意,我也测试了您的代码并得到了与您相同的错误。有一个命令行实用程序“/usr/bin/macerror”,我在其中输入了您的错误代码。结果如下。

Unknown error (-10810) at /usr/bin/macerror5.18 line 40, <DATA> line 1.

祝你好运。

【讨论】:

  • 我现在不在我的 Mac 前,但不,这不是问题所在。我的 shebang 是正确的,我的脚本运行良好,除非要激活的应用程序尚未运行。
  • 请注意,您的有问题的脚本根本不等同于我的。
  • 没问题。老实说,对于您毫无头绪的回答,我已经足够礼貌了。你甚至理解我的两个示例脚本吗?你明白 shebang #!/use/bin/osascript 是什么意思吗?要么你不读,要么你不会读这个问题。不要那么粗鲁,当答案完全没有线索时,这就是你得到的。我们为什么不删除答案和不满意的 cmets?
  • 顺便说一句,已经讨论过类似的问题,但对于它是“进程表”错误有些困惑,我认为它不是(技术上)。这似乎是 LSOpenURLsWithRole() 中的一个错误。
  • 虽然一般来说了解macerror 实用程序是件好事,但在这种情况下,它的输出只是表明错误的查找失败,即macerror 不能检索有关此错误的信息(不知道,为什么)。实际的错误信息 - 取自 LSInfo.h - 是:kLSUnknownErr = -10810, /* Unexpected internal error*/,OP 已经在他的问题 (thexlab.com/faqs/error-10810.html) 中提供了指向背景信息的链接。
【解决方案3】:

无需使用 osascript 来启动应用程序。有一个名为 open 的内置命令行实用程序,它将从终端命令行或 shebanged 脚本打开您的应用程序。对于文档,在终端窗口中输入“man open”。这是一个非常漂亮的实用程序,有很多选择。 :)

open 实用程序将启动未运行的应用程序,但出于好奇,我也想知道:您是否尝试过“告诉应用程序应用程序名称运行”,或者只是“告诉应用程序应用程序名称激活”?

下面的 osascript,在 10.9 上为我工作

#!/usr/bin/osascript
tell application "TextEdit" to launch

我想您必须命令应用程序执行某些操作,而不仅仅是尝试“启动”它。也许“告诉我启动应用程序 appname 也可以”。

编辑

我更喜欢使用 open -b "com.apple.textedit",因为这样我也得到了 textEdit 的前窗口,放在前面。

顺便说一句,使用 open -e 命令,您可以从命令行直接在 TextEdit 中打开文本文件。 open 不如 plan-9 的实用工具好,但它真的很漂亮。

【讨论】:

  • 感谢您告诉我有关 open 的信息,但不,谢谢,多年来我非常了解。这里的示例脚本只是错误报告中使用的最小工作示例,并不适用于现实世界。所以请坚持这个问题。关于现实世界:tell application ... activate ... end tell,如果它还没有运行并且几乎出现在每个 AppleScript 中,它也会启动一个应用程序,正如我在问题中指出的那样,它也会中断。
  • “出于好奇,我也想知道:您是否尝试过“告诉应用程序应用程序名称运行”,或者只是“告诉应用程序应用程序名称激活”?这在问题本身中得到了回答,请仔细阅读。
  • 关于答案的唯一相关部分,即“在 10.9 上为我工作”,这已经在 cmets 中得到证实。适用于 10.9 及更低版本,在 10.10 中断。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 2014-11-16
  • 2012-07-02
  • 2021-08-23
相关资源
最近更新 更多