在我的起居室里,我有一台Mac Mini,我既可以用作HTPC,也可以用作家庭自动化服务器。它用于自动化的软件是Shion,一个支持AppleScript的免费家庭自动化应用程序。在同样的Mac Mini上,我正在运行Apache并构建了一个接口,通过它我可以发送命令。 (对于它的价值,接口是使用jQuery Mobile构建的。)
我遇到的麻烦是AppleScripts在终端和AppleScript编辑器中运行良好,在Apache错误日志中抛出了解析错误。由于终端和AppleScript编辑器成功运行脚本,我猜我编写PHP的方式就是问题所在。但是当我检查错误日志时,它实际上是一个出现的AppleScript错误。
AppleScript命令非常简单:
tell application "Shion"
execute snapshot "Evening Lighting"
end tell
甚至更简单:
tell application "Shion" to execute snapshot "Evening Lighting"
这是我开始使用的原始命令,因为我不确定如何使用-e标志将AppleScript分成多行。当我将它粘贴到AppleScript编辑器或终端中时,它会毫无问题地执行。但是在PHP中运行它是行不通的:
$cmd = "osascript -e 'tell application \"Shion\" to execute snapshot \"Evening Lighting\"'";
exec($cmd);
在日志文件中,脚本返回的错误是“ A [原文如此]标识符不能追溯到此标识符”。这是一个AppleScript错误,多人遇到过,但我找不到任何一致的解决方案。我找到的一个主要是尝试添加“使用应用程序中的术语”Shion“'到脚本的开头,这样看起来像这样:
using terms from application "Shion"
tell application "Shion"
execute snapshot "Evening Lighting"
end tell
end using terms from
我必须弄清楚如何使用osascript将AppleScript分成多行,这可以使用-e标志来完成。如果我将其作为常规osascript命令运行,它看起来像这样:
osascript -e 'using terms from application "Shion"' -e 'tell application "Shion"' -e 'execute snapshot "Evening Lighting"' -e 'end tell' -e 'end using terms from'
再一次,它在终端中运行没有问题,以及AppleScript编辑器。但是现在我的日志中出现了一个不同的错误:“预期的行尾但找到了标识符”。
答案 0 :(得分:0)
我认为PHP语法不是问题所在。我的Mac上没有安装Shion,这就是我在Finder和PHP中看到的内容:
$ osascript -e 'tell application "Finder" to activate'
[Finder pops to foreground]
$ osascript -e 'tell application "Shion" to execute snapshot "Evening Lightning"'
28:44: syntax error: A identifier can’t go after this identifier. (-2740)
$ php -a
Interactive shell
php > exec("osascript -e 'tell application \"Finder\" to activate'");
[Finder pops to foreground]
php > exec("osascript -e 'tell application \"Shion\" to execute snapshot \"EveningLighting\"'");
28:44: syntax error: A identifier can’t go after this identifier. (-2740)
请注意,我在shell和PHP中都遇到了同样的错误,但Finder事件同时适用于两者。我怀疑问题是PHP脚本运行的上下文:它在apache进程下运行,而不是在用户会话中运行,因此无法“看到”Shion应用程序。
不幸的是,如果我说对了,我不知道如何让它发挥作用。
答案 1 :(得分:0)
使用单引号为我工作,至少使用交互式php:
$cmd = 'osascript -e \'tell application "Shion" to execute snapshot "Evening Lightning"\''