• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

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:

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
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

VisioNOIR

Holländischer Prinz
Registriert
23.08.09
Beiträge
1.871
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
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
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. :)
 

VisioNOIR

Holländischer Prinz
Registriert
23.08.09
Beiträge
1.871
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...
 

Bomberzocker

Auralia
Registriert
08.06.08
Beiträge
202
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?
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
Nein. Nur die diversen Locales im Skript eindeutig definieren. zB so:
Code:
LC_ALL=C sleep 0.3;