AppleScript:从 shebang 脚本启动某些应用程序时执行错误 -10810

AppleScript: execution error -10810 when launching certain applications from shebang'ed scripts

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

的示例脚本
#!/usr/bin/osascript
launch application "TextEdit"

当 TextEdit 不 运行ning 而我

./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, but they don't help. I also tried to understand error -10810 by reading articles like this one,但我的问题绝对不像一个已填充的过程 table(否则为什么直接调用 osascript 工作,而 运行ning osascript 从 shebang 没有?)。

查看 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.

祝你好运。

无需使用 osascript 启动应用程序。有一个名为 open 的内置命令行实用程序,它将从终端命令行或 shebanged 脚本打开您的应用程序。要进行文档化,请在终端 window 中输入 "man open"。这是一个非常漂亮的实用程序,有很多选项。 :)

开放实用程序,将启动非 运行 的应用程序,但出于好奇,我也想知道:您是否尝试过 "tell application appname to run",或者只是 "tell application appname to activate"?

下面的 osascript 对我有用,适用于 10.9

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

我想您必须命令该应用程序执行某些操作,而不仅仅是尝试 "launch" 它。也许 "tell me to launch application appname also works".

编辑

我更喜欢用open -b "com.apple.textedit",因为这样我也得到了textEdit的前端window,被带到了前端。

顺便说一下,使用 open -e 命令,您可以从命令行直接在 TextEdit 中打开文本文件。 open 不如 plan-9 的 plumb 实用程序完全好,但它确实很漂亮。

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


只是为了提供一份国情咨文post:

观察到的行为是 OSX 10.10 中的 bug 截至 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 < 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