繁体   English   中英

通过NSTask发行X11应用程序

[英]Issue launching X11 app via NSTask

我的应用程序使用NSTask执行shell脚本,这些脚本之一启动X11应用程序(特别是meld )。

我本来希望它能起作用:

#!/bin/bash
source ~/.profile                      # setup $PATH/etc
meld .

但是它失败了:

gtk.icon_theme_get_default().append_search_path(meld.paths.icon_dir())
Traceback (most recent call last):
  File "/usr/local/bin/meld", line 132, in <module>
    gtk.icon_theme_get_default().append_search_path(meld.paths.icon_dir())
AttributeError: 'NoneType' object has no attribute 'append_search_path'

作为概念验证,我将脚本更改为此,可以完美地工作:

#!/usr/bin/ruby

exec 'osascript -e \'tell app "Terminal" to do script "meld ' + Dir.pwd + '" in front window\''

有人引起问题吗? 这是我执行Shell脚本的代码:

NSTask *task = [[NSTask alloc] init];
task.launchPath = self.scriptURL.path;
task.standardOutput = [NSPipe pipe];
task.currentDirectoryPath = workingDirectoryURL.path;

[task launch];

X11应用程序使用DISPLAY环境变量来学习显示服务器的地址。

在OS X上,出于安全原因,DISPLAY值是随机的,因此您无法像注意到的那样对其进行硬编码。 取而代之的是,有一个启动的代理告诉启动的启动进程时设置DISPLAY。

在启动和合并之间的某个位置,DISPLAY的值被删除或覆盖。 您的工作是找出位置。

  1. 确保启动的代理正在运行。 运行launchctl list然后查找org.macosforge.xquartz.startx。 由于meld是从Terminal.app运行的,因此这部分可能是正确的。
  2. 确保在您的应用中设置了“显示”。 它应该在[NSProcessInfo processInfo].environment
  3. 确保在启动的NSTask中设置了DISPLAY。 尝试使用NSTask运行/usr/bin/env ,并确保DISPLAY出现在其输出中。
  4. 确保在您运行的脚本中设置了DISPLAY。 在获取〜/ .profile之前和之后尝试echo $DISPLAY (有时,.profile本身会将DISPLAY覆盖为一个不正确的值,因为在其他操作系统上有时这样做是正确的。)

编辑:这是我用来将DISPLAY从GUI应用程序复制到Shell脚本的代码:

NSTask *task = ...
task.environment = [NSProcessInfo processInfo].environment;
[task.launch];

更改脚本以生成环境变量,并将“工作”与“不工作”进行比较。

在不同执行模型之间初始化外壳的方式之间有细微的差异。 几乎可以肯定,环境是问题的根源。

看看男人launchctl

launchctl提交... -p / usr / local / bin / meld-。

启动工作; 这将为您设置某些环境变量,这些变量是每个用户会话的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM