0

私のアプリはNSTaskを使用してシェルスクリプトを実行し、それらのスクリプトの1つが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\''

問題を引き起こしている人はいますか?シェルスクリプトを実行するための私のコードは次のとおりです。

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

[task launch];
4

3 に答える 3

2

X11アプリは、DISPLAY環境変数を使用してディスプレイサーバーのアドレスを学習します。

OS Xでは、セキュリティ上の理由からDISPLAY値がランダム化されているため、お気づきのとおり、ハードコーディングすることはできません。代わりに、プロセスの開始時にDISPLAYを設定するようにlaunchdに指示するlaunchdエージェントがあります。

launchdとmeldの間のどこかで、DISPLAYの値が削除または上書きされています。あなたの仕事はどこを見つけることです。

  1. launchdエージェントが実行されていることを確認してください。実行launchctl listしてorg.macosforge.xquartz.startxを探します。Terminal.appから動作しているのでmeld、この部分はおそらく正しいです。
  2. アプリでDISPLAYが設定されていることを確認してください。にリストされている必要があります[NSProcessInfo processInfo].environment
  3. 起動するNSTaskでDISPLAYが設定されていることを確認してください。/usr/bin/envNSTaskを使用して実行し、出力にDISPLAYが表示されることを確認してください。
  4. 実行するスクリプト内でDISPLAYが設定されていることを確認してください。echo $DISPLAY〜/.profileを調達する前後に試してください。(.profile自体がDISPLAYを誤った値に上書きすることがあります。これは、他のオペレーティングシステムで行うのが正しい場合があるためです。)

編集:これは、GUIアプリからシェルスクリプトにDISPLAYをコピーするために使用したコードです。

NSTask *task = ...
task.environment = [NSProcessInfo processInfo].environment;
[task.launch];
于 2013-03-27T06:36:32.997 に答える
1

スクリプトを変更して環境変数を吐き出し、「機能している」と「機能していない」を比較します。

異なる実行モデル間でシェルが初期化される方法には微妙な違いがあります。ほぼ確実に、環境が問題の原因です。

于 2013-03-27T03:12:49.347 に答える
0

manlaunchctlを見てください

launchctl submit ... -p / usr / local / bin/meld-。

起動したジョブを起動します。これにより、ユーザーごとのセッションの一部である特定の環境変数が設定されます。

于 2013-03-27T06:18:38.490 に答える