• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

AppleScript soll ein Terminal-Script unsichtbar ausführen

VisioNOIR

Holländischer Prinz
Registriert
23.08.09
Beiträge
1.871
Hallo, öhm, ich meine *Weihnachtsmannbart ankleb* Ho Ho Ho zusammen! ;-)

(für alle, die das "Vorgeplänkel" überspringen möchten, runterscrollen bis zum Marker)

Folgende Ist-Situation:

* Mac Mini (OS 10.6.8) vorhanden
* dieser agiert primär als heimischer Media-Server
* zum Musikhören läuft der Logitech Media Server 7.7.0 als Zuspieler für meine Logitech Squeezeboxen auf dem Mini
* da der Mini eh im Wohnzimmer steht, wird dieser mit der Software SqueezeSlave (welche sich mehr oder weniger wie eine Hardware-Squeezebox verhält) zum Versorgen der angeschlossenen HiFi-Anlage betraut


So weit, so gut, läuft wie erwartet.

Zum Steuern der Musik benutze ich, je nach Situation, entweder die Logitech Media Server-Weboberfläche oder die App iPeng auf diversen iTouch-Geräten. Jetzt nenne ich auch eine Logitech Harmony (Universalfernbedienung) mein Eigen. Nun hatte ich die illustre Idee, mit jener Infrarot-Ferbedienung zumindest die rudimentären Abspielfunktionen (lauter, leiser, nächstes Lied, vorheriges Lied) zu steuern. Nichts leichter als das, dachte ich mir, Candelair und Remote Buddy installiert und eigene Behaviours programmiert. Funktioniert im Grunde auch ganz gut, nur mit einem kosmetischen Makel (und jetzt folgt auch die eigentliche Frage):


------------- MARKER ---------------

Meine Remote Buddy-Behaviours bestehen aus AppleScript-Schnippseln, welche via Telnet CLI-Strings an die Logitech-Software schicken. Diese funktionieren, nur öffnet sich immer ein Terminal-Fenster sichtbar auf dem Desktop, wenn die Behaviour-Aktion getriggert wird. Diese "visuelle Rückmeldung" würde ich gerne vermeiden.

Der Quelltext sieht ähnlich wie folgt aus:
Code:
set telnet to "telnet 127.0.0.1 9090
00%3A00%3A00%3A00%3A00%3A01 playlist index +1
exit"
tell application "Terminal"
	run
	do script telnet
	delay 0.2
	close
	quit
end tell

Jegliche Versuche mit
Code:
set visible to false
das Terminal-Fenster nach dem Starten des Terminals zu verstecken als auch das Terminal über ein Mutter-Prozess direkt unsichtbar zu starten
Code:
tell application "System Events" to run application "Terminal" without visible
führen dazu, dass die Telnet-Verbindung garnicht erst aufgebaut wird, der CLI-String erreicht also die Server-Software garnicht.

Wie kriege ich das Problem am geschicktesten gelöst?


Thanx in advance & Merry X-Mas
Michael
 
Zuletzt bearbeitet:
Sieh dir doch einfach mal den AS-Befehl "do shell script..." an.
(Das mit /bin/sh ausgeführte Skript wird zwischen Gänsefüsschen gestellt, darin enthaltene Gänsefüsschen und Backslashes müssen mit einem weiteren Backslash maskiert werden.)
Beispüle hier.
 
  • Like
Reaktionen: VisioNOIR
Super Tipp! Danke dafür!

Der Quelltext sieht jetzt ähnlich wie folgt aus und funktioniert wunderbar
Code:
set telnet to "(sleep 0.2; echo 00%3A00%3A00%3A00%3A00%3A01 playlist index +1; echo exit) | telnet 127.0.0.1 9090"

do shell script telnet
 
Mit dem "sleep 0.2" solltest du nicht arbeiten. Der Dezimalpunkt ist Locale-abhängig und kann (Environment-bedingt) zu Syntaxfehlern führen. Benutze lieber nur Ganzzahlen, soviel Zeit dürftest du übrig haben. :-)
 
Oh je, mal schaun, ob ich die 0,8 Sekunden erübrigen kann... ;-)

Ich behalte es im Hinterkopf. Momentan streite ich mich ein wenig mit den Behaviours von Remote Buddy, da mit der selben Fernbedienung sowohl eyeTV als auch Plex (und die erwähnte SqueezeSlave) gesteuert werden sollen. Noch möchte das nicht so wie ich es gerne hätte...
 
Mit dem "sleep 0.2" solltest du nicht arbeiten. Der Dezimalpunkt ist Locale-abhängig und kann (Environment-bedingt) zu Syntaxfehlern führen. Benutze lieber nur Ganzzahlen, soviel Zeit dürftest du übrig haben. :-)
und wenn man eine fünftel Sekunde haben möchte? Muss man dann "sleep 1/5" schreiben?
 
Nein. Nur die diversen Locales im Skript eindeutig definieren. zB so:
Code:
LC_ALL=C sleep 0.3;