当前位置: 首页 > 知识库问答 >
问题:

PHP执行osascript不同于终端?

邴子实
2023-03-14

在我的客厅里,我有一台苹果迷你电脑,既是HTPC,也是家庭自动化服务器。它用于自动化的软件是Shion,这是一款免费的家庭自动化应用,支持苹果脚本。在同一台苹果迷你电脑上,我运行着Apache,并建立了一个可以发送命令的界面。(不管怎样,这个界面是使用jQuery Mobile构建的。)

我遇到的问题是,在终端和AppleScript编辑器中工作正常的AppleScripts正在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);

在日志文件中,脚本返回的错误是“[原文如此]标识符不能在这个标识符之后”。这是一个多个人都遇到过的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编辑器中运行时没有问题。但现在我的日志中出现了一个不同的错误:“预期行尾,但找到了标识符”。

共有2个答案

厍书
2023-03-14

使用单引号对我来说很有效,至少在交互式php中是这样:

$cmd = 'osascript -e \'tell application "Shion" to execute snapshot "Evening Lightning"\''
潘坚白
2023-03-14

我不认为PHP语法是问题所在。我的Mac上没有安装Shion,下面是我在Finder vs. 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应用程序。

不幸的是,如果我是对的,我不知道如何让它工作。

 类似资料:
  • 下面的函数负责管理后端服务中的请求 返回 我看到输出,但函数执行没有终止,响应似乎成功了,但实际上并非如此...这里怎么了?

  • 问题内容: 我正在尝试将控制台置于Java中的“原始”模式。我了解这仅适用于UNIX。 我正在使用命令 如果我直接在终端中键入命令,它将完成应有的操作。在Java中,我尝试设置如下模式: 但是终端不会进入原始模式。 我有一种感觉,这是因为Java只是在后台的虚拟终端中执行命令,而不是在活动终端中执行命令。有没有办法做到这一点? 问题答案: 由于JVM重定向了stdio / stdout / std

  • 我正在尝试创建一个bash。sh脚本文件,使用osascript打开一个新的终端窗口/选项卡,然后运行两个命令“cd fs”和“gulp”(都在同一窗口/选项卡中) 这就是我正在尝试的,它在另一个(第三个)窗口/选项卡中运行第二个命令(做脚本“大口吃”),而不是打开的第二个。

  • M1 Mac系统终端< code>firebase模拟器:启动按预期工作。 但VSCode在同一命令上集成了终端错误(错误如下)。 我该如何解决这个问题? 如果重要的话,我同时使用Fish和Zsh,并且两者的行为是一致的:Fish和Zsh都在Mac终端应用程序中运行命令,但不是从VSCode的集成终端运行。 从VSCode集成终端运行时出错:

  • 我想扫描带有子文件夹的文件夹,这是我的配置 我的问题: > 如何扫描Source/Center*(不带子文件夹目标) 如何在源/Center_A Center_A/目标中路由源/中扫描的文件,以及如何在源/Center_B/目标中路由源/Center_B 我的骆驼语境.xml 编辑1: 第一个问题已解决 编辑2: 第二个问题已修复 最后一个问题,移动选项就足够了,我不想使用 这可能吗?

  • 到目前为止,我认为有效的final和final或多或少是等价的,如果在实际行为中不完全相同,JLS会将它们视为相似的。然后我发现了这个人为的场景: 显然,JLS在这两者之间产生了重要的区别,我不知道为什么。 我阅读其他线程,如 最终和有效最终之间的差异 有效的最终变量vs最终变量 变量“有效最终”是什么意思 但他们并没有详细说明。毕竟,在更广泛的层面上,它们似乎几乎相当。但深入研究,他们显然有所不