Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >PHP执行osascript与终端不同?

PHP执行osascript与终端不同?
EN

Stack Overflow用户
提问于 2012-11-16 17:23:02
回答 2查看 1.3K关注 0票数 2

在我的起居室里,我有一台Mini,它既是一台HTPC,也是一台家庭自动化服务器。它用于自动化的软件是Shion,这是一个免费的家庭自动化应用程序,它具有AppleScript功能。在同一台Mini上,我正在运行Apache,并构建了一个可以发送命令的接口。(就其价值而言,该接口是使用jQuery移动构建的。)

我遇到的问题是,在终端和AppleScript编辑器中工作良好的AppleScript正在抛出Apache日志中的解析错误。由于终端和AppleScript编辑器成功地运行了脚本,我猜我编写PHP的方式就是问题所在。但是当我检查错误日志时,它实际上是一个AppleScript错误。

AppleScript命令非常简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tell application "Shion"
    execute snapshot "Evening Lighting"
end tell

或者更简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tell application "Shion" to execute snapshot "Evening Lighting"

这是我开始使用的原始命令,因为我不确定如何使用-e标志将AppleScript分解为多行。当我将其粘贴到AppleScript编辑器或终端中时,它将执行而不会出现任何问题。但是在PHP中运行它是行不通的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$cmd = "osascript -e 'tell application \"Shion\" to execute snapshot \"Evening Lighting\"'";
exec($cmd);

在日志文件中,脚本返回的错误是"A sic标识符不能跟踪此标识符“。这是多个人遇到的AppleScript错误,但我找不到任何一致的解决方案。我发现的一条线索是试图在脚本的开头添加‘使用应用程序“中的术语”Shion“,这样看起来如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using terms from application "Shion"
    tell application "Shion"
        execute snapshot "Evening Lighting"
    end tell
end using terms from

我必须弄清楚如何用osascript将AppleScript分解成多行,这可以使用-e标志来完成。如果我将它作为常规的osascript命令运行,它看起来如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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编辑器中运行,没有任何问题。但是现在我在日志中得到了一个不同的错误:“预期的行尾但找到了标识符”。

EN

回答 2

Stack Overflow用户

发布于 2012-11-16 18:52:55

我不认为PHP语法是问题所在。我没有在我的Mac上安装Shion,以下是我在Finder vs.中看到的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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应用程序。

不幸的是,如果我是对的,我不知道有什么办法让它起作用。

票数 0
EN

Stack Overflow用户

发布于 2012-11-17 01:26:41

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$cmd = 'osascript -e \'tell application "Shion" to execute snapshot "Evening Lightning"\''
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13426728

复制
相关文章
Activemq获取消费者数量(consumerCount)
最近开始学习activemq系统的使用,关于如何在activemq中时实获取一个主题/队列(topic/queue)的订阅/消费者数量,让我花了挺多时间才搞明白: 在activemq中,可以通过订阅主题或队列对应的消息管理主题,从而获取咨询消息(Advisory Message), 每当新增/减少订阅者时都会收到相关的咨询消息。 Advisory Message中就包含了一些我们想要的数据(包含在consumerCount属性中)。 关于Advisory Message的详细说明参见官方文档: http://activemq.apache.org/advisory-message.html
10km
2020/02/13
2.5K2
ActiveMQ学习之SpringBoot整合ActiveMQ------>主题生产者和消费者
一、pom <!--聚合工程集成关系--> <!--统一整合第三方框架依赖信息--> <parent> <groupId>org.springframework.boot</grou
用户5899361
2020/12/07
3430
ActiveMQ学习之SpringBoot整合ActiveMQ------>队列生产者和消费者
一、pom <!--聚合工程集成关系--> <!--统一整合第三方框架依赖信息--> <parent> <groupId>org.springframework.boot</grou
用户5899361
2020/12/07
5350
ActiveMQ多个消费者消费不均匀问题
如果客户端处理很慢的话,Broker会在之前发送消息的反馈之前,继续发送新的消息到客户端。如果客户端依旧很慢的话,没有得到确认反馈的消息会持续增长。在这种情况下,Broker有可能会停止发送消息给消费者。当未被反馈的消息达到了prefetch limit设置的数字时,Broker将会停止给消费者发送新的消息。除非消费者开始给与反馈,否则得不到任何消息。
java架构师
2019/04/09
1.7K0
ActiveMQ多个消费者消费不均匀问题
activemq之消费者消费解析与高可用策略(三)
有两种方法可以接收消息,一种是使用同步阻塞的MessageConsumer#receive方法。另一种是使用消息监听器MessageListener。这里需要注意的是,在同一个session下,这两者不能同时工作,也就是说不能针对不同消息采用不同的接收方式。否则会抛出异常。
周杰伦本人
2022/10/25
8100
activemq之消费者消费解析与高可用策略(三)
activeMQ
activeMQ 是学习java消息队列的实现项目,使用jfinal + jfinal-ext + activeMQ + quartz快速构建。 1.消息队列 消息队列,其实是一种基于数据结构实现的服务。而java语言中的实现,有apache的activeMQ,比较主流。 2.环境搭建 首先去apache的官网下载apache-activeMQ-...-.zip的包,解压后,运行bin中的activeMQ服务。 在浏览器中输入http://localhost:8186/admin,出现登陆界面输入admin
用户1220053
2018/02/09
9330
activeMQ
activemq学习之activemq功能(一)
消息中间件是值利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。 通过提供消息传递和消息排队模型,可以在分布式架构下扩展进程之间的通信。
周杰伦本人
2022/10/25
1.1K0
activemq学习之activemq功能(一)
ActiveMQ入门
Apache ActiveMQ是当前最流行的开源的,支持多协议的,基于Java的消息中间件,官网的原话是:Apache ActiveMQ™ is the most popular open source, multi-protocol, Java-based messaging server.
CodingDiray
2020/04/24
9711
ActiveMQ入门
ActiveMQ学习总结------Spring整合ActiveMQ 04
注:本文将省略一部分与ActiveMQ无关的spring、mvc等代码,学习者需有SSM框架基础
Arebirth
2020/06/19
5690
ActiveMQ学习之java代码调用ActiveMQ队列
queue:在点对点消息传递域中,目的地被称为队列(一对一)
用户5899361
2020/12/07
6910
ActiveMQ学习之java代码调用ActiveMQ队列
深入讲解ActiveMQ5.X消息的持久性
我经常被问到一些基本的关于解释消息存储在ActiveMQ中是如何工作的问题。在这里我将做一个高层面的解释。注意,上下文环境是它是在JMS范围内。如果你使用的是ActiveMQ的非JMS客户端(e.g.,STOMP,AMQP,MQTT,等),那么它的行为在一些案例中会有所不同。 ActiveMQ JMS的持久性保证对于被标记为“持久的”而不能丢失的消息而言是非常强大的. 让我们看下它在ActiveMQ中是如何被运用的. 主题 主题使用了一个广播机制. 它允许我们在JMS领域使用发布订阅语义模型. 但当我们将一
用户1263954
2018/01/30
7690
深入讲解ActiveMQ5.X消息的持久性
高效协作处理缓存清理需求:生产者-消费者模式助力多模块缓存管理
在现代应用系统中,缓存是提高性能和减少数据库负载的重要手段之一。然而,缓存的数据在某些情况下可能会过期或者变得无效,因此需要及时进行清理。在复杂的应用系统中,可能有多个系统、多个模块产生缓存清理需求,而这些系统、模块之间的清理任务需要高效的协作,以避免数据竞争和资源浪费的问题。
修己xj
2023/08/25
1880
高效协作处理缓存清理需求:生产者-消费者模式助力多模块缓存管理
activeMQ 原
ActiveMQ 消费者接收消息两种方式 1.使用同步方式:消费者会一直等待生产者发送消息或者超市。因其是阻塞式接收消息,故当第一次接收生产者发送过来的消息并消费后,第二次生产者提供的消息不再消费。 2.使用异步监听方式:消费者通过注册监听器,每当生产者有新的消息提供过来是会触发MessageListener的回调方法onMessage()方法。便于后续消息处理。 小结:使用同步方式相当于一次性消费,在实际生产环境中不可能采用这种方式,不至于每次推送数据都重启不服务,不符合实际运用场景,推荐使用注册
wuweixiang
2018/08/14
5230
ActiveMQ详解(1)——ActiveMQ简介与入门程序
ActiveMQ是Apache发布的一款功能强大的消息中间件,它基于JMS 1.1 和 J2EE 1.4规范,目前使用十分广泛。
张申傲
2020/09/03
1.2K0
ActiveMQ 入门
1. 下载 ActiveMQ , 到 activemq 官网上下载 Windows 或者 Linux 对应的安装包
北漂的我
2019/05/29
5350
ActiveMQ介绍
1、ActiveMQ服务器工作模型       通过ActiveMQ消息服务交换消息。消息生产者将消息发送至消息服务,消息消费者则从消息服务接收这些消息。这些消息传送操作是使用一组实现 ActiveMQ应用编程接口 (API) 的对象来执行的。       ActiveMQ客户端使用 ConnectionFactory 对象创建一个连接,向消息服务发送消息以及从消息服务接收消息均是通过此连接来进行。Connection 是客户端与消息服务的活动连接。创建连接时,将分配通信资源以及验证客户端。这是一个相当重要
小帅丶
2018/02/08
1.1K0
初识ActiveMQ
①.消息传递方式介绍: Activemq支持两种方式的消息传递:     广播模式:1-n的方式,是一种发布订阅模式,像腾讯新闻那样,只要我们微信关注了腾讯新闻,那么每个人都会收到推送的新闻     队列模式:1-1的方式,只能有一个消费者端消费生产者生产的数据 ②.消息类型介绍:         Activemq提供了两种消息类型:持久化和非持久化:         消息生产者使用持久(persistent)传递模式发送消息的时候,Producer.send() 方法会被阻塞,直到 broker 发送一个
用户1215919
2018/02/27
2.1K0
安装ActiveMQ
接着进入到与系统位数对应的目录下,使用管理员身份运行activemq.bat,就可以直接启动了:
端碗吹水
2020/09/23
7460
安装ActiveMQ
ActiveMQ学习之linux下ActiveMQ环境搭建
https://activemq.apache.org/components/classic/download/
用户5899361
2020/12/07
6180
ActiveMQ学习之linux下ActiveMQ环境搭建
ActiveMQ学习之java代码调用ActiveMQ主题
queue:在点对点消息传递域中,目的地被称为队列(一对一)
用户5899361
2020/12/07
4090
ActiveMQ学习之java代码调用ActiveMQ主题

相似问题

ASIHTTPRequest似乎总是缓存JSON数据

20

芭乐缓存'expireAfterWrite‘似乎并不总是有效

14

ActiveMQ:慢速处理消费者

12

ActiveMQ -平衡消费者人数

11

当我不想让FireFox缓存表单时,它似乎总是缓存它

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文