1

Ich habe eine Befehlszeilenanwendung für Mac OS ohne GUI erstellt. Diese Anwendung befindet sich unter/usr/local/bin. Und in einigen Fällen muss ich Apple Script innerhalb dieser Anwendung ausführen. Dazu erstelle ich ein NSTask und versuchen Sie den folgenden Befehl auszuführen:Apple Skript kann nicht über die Befehlszeilenanwendung ausgeführt werden

NSTask *createTask = [[NSTask alloc] init]; 
    createTask.launchPath = @"/bin/bash"; 
    NSString *showAlert = [NSString stringWithFormat:@"/usr/bin/osascript -e 'tell application \"Finder\" to display alert \"My text.\"'"]; 
    NSArray *arguments = [NSArray arrayWithObjects:@"-c",showAlert, nil]; 
    createTask.arguments = arguments; 
[createTask launch]; 

Nachdem es läuft, passiert nichts, nur in Protokollen die Meldung angezeigt werden:

Apr 14 15:35:15 Mac-mini kernel[0]: my-app: guarded fd exception: fd 0 code 0x2 guard 0x7fff8b9e12a8 
Apr 14 15:35:15 Mac-mini com.apple.xpc.launchd[1] (com.apple.ReportCrash.Root[26852]): Endpoint has been activated through legacy launch(3) APIs. Please switch to XPC or bootstrap_check_in(): com.apple.ReportCrash.DirectoryService 
Apr 14 15:35:15 Mac-mini diagnosticd[16097]: error evaluating process info - pid: 26851, punique: 26851 
Apr 14 15:35:16 Mac-mini sandboxd[16099] ([26851]): my-app(26851) deny file-read-data/

Aber wenn Sie diesen Befehl ausführen direkt vom Terminal aus, wird es korrekt ausgeführt. Bitte sag mir, was mache ich falsch?

+0

Ich habe eine Ahnung, dass 'NST ask "würde die Run-Schleife verwenden. Wie verwalten Sie die Run-Loop in Ihrem Programm? – trojanfoe

+0

Es scheint, dass ich nicht Run-Loop-Management verwendet. Können Sie vorschlagen, dass ich es versuchen sollte? – Emmett

+0

Ich glaube nicht, dass es sich tatsächlich um Ihr Problem handelt, aber wenn Sie das Foundation-Framework verwenden, benötigen Sie für viele davon eine Run-Schleife. Ich habe eine einfache [RunLoopController] (https://github.com/trojanfoe/RunLoopController) für die Verwendung in der Befehlszeile, die Sie hilfreich finden könnten. – trojanfoe

Antwort

0

Ich denke, das Problem kann mit Ihrer Verwendung von Anführungszeichen sein. Wenn ich versuche, den gleichen Befehl in der Shell mit Ihrem Zitatstil manuell auszuführen, wird es nicht funktionieren. Meine Beispiele unten funktionieren. Können Sie Ihre einfachen und doppelten Anführungszeichen ändern? Umgeben Sie Ihren ersten Aufruf mit einfachen Anführungszeichen und verwenden Sie dann das doppelte Anführungszeichen um das osascript? Außerdem muss die tell application \"Finder\" to nicht verwendet werden, da die Anzeigewarnung nicht Teil des Finder-Wörterbuchs ist.

Sie haben ...

/usr/bin/osascript -e 'tell application \"Finder\" to display alert \"My text.\"' 

Versuchen Sie es zu ändern, um ...

/usr/bin/osascript -e "display alert \"My text.\"" 

Oder eine noch einfachere Version ...

osascript -e "display alert \"My text.\"" 
+0

Ich denke, das Problem liegt nicht in der Syntax. Denn wenn ich meine commend-line-Anwendung vom Terminal aus starte, funktioniert alles einwandfrei. Aber in diesem Fall wird meine Befehlszeilenanwendung von einer anderen Anwendung (Treiber) aufgerufen, die nicht vom Hauptthread stammt. – Emmett