Applescript, behandla output från shell script

Tråden skapades och har fått 22 svar. Det senaste inlägget skrevs .
1

I iChat så kan man sätta custom Alerts när något händer. T.ex. en "buddy" blir tillgänglig online. Om man höger klickar på en "buddy" och gör "Show info" så på."Alerts" tabben så kan man välja "Announce when event occurs". Men det är en ganska lång harrang som kommer ut då. Jag ville ha något lite kortare. Jag skrev ett pyttelitet Applescript som ser ut som följer:

do shell script "say Fred is online"

Kör man den vid ett "event" m.a.o. ha det valt med "Run AppleScript", så spelas rätt ljud upp, men man får ett felmedelande som säger:

AppleScript Event Handler Error
AN error occured while executing an AppleScript event handler.

Event: Buddy Becomes Available
Buddy: Fred
File: Fred is online.scpt
Error: Error -1708

Som verkar vara ett: "errAEEventNotHandled -1708 Script context doesn't contain handler for event"
OSADoEvent(IM:IC)

i ScriptEditor när man testkör detta script, då blir resultatet:

tell current application
	do shell script "say Fred is online"
		""
end tell

Jag gissar att utmatningen av en (tom?) sträng som visas som "" förmodligen är det "event" som 1708 felmeddelandet klagar på. Eftersom Applescriptet inte tar hand om det.

Hur tar man hand om detta så att jag inte får ett felmeddelande? Jag är en glad amatörscriptare och vore jätteglad om man fick ett tips av någon.

Tack!

Jag förstår inte riktigt varför du går via shell.
Är det inte bättre att använda enbart applescript:

say "say Fred is online"

Eller har jag missat nåt?

Annars kan du kanske testa att escape:a citattecknet:

do shell script \"say Fred is online\"

Vilken version av iChat är det där? I Min iChat (3.1.9 / OS X 10.4.11) så har jag tom en ruta där det står "Läs upp text" och där kan man skriva en text som man vill iChat skall läsa upp när händelsen inträffar.

Felet i ditt script är förmodligen att du adresserar ditt kommando till fel program, den missen har jag gjort 1000 gånger...

Du har

tell current application <--- Alltså iChat

do shell script "say Fred is online" <--- Vet iChat hur man gör ett "do shell script"?

Varför inte helt enkelt skippa ditt tell-kommando? och bara behålla raden "do shell script..."

Tips till nybörjare i Applescript - tänk dig varje applikation som någon typ av hantverkare, en kan måla, en kan flytta tegelstenar, en annan kan snickra, en annan kan bygga bilar osv... När du använder "tell application" så tänk dig att du står i en cirkel av alla dina hantverkare och du vänder dig mot en av dem och ber dem göra något. Man måste alltså tänka på att inte be målaren att snickra, och han som flyttar tegelstenar att bygga bilar osv...

Förresten, om du vill göra en annan fiffig grej med iChat, Adium och Skype som är att via Appelscript sätta samma statusmeddelande i alla tre, så kolla denna tråd:

http://www.99.se/applescript/229460-applescript-s-tter-samma-status-i-skype-i-ichat.html

  • Medlem
  • Mölndal
  • 2008-06-10 22:43
Ursprungligen av Taz_1999:

Tips till nybörjare i Applescript - tänk dig varje applikation som någon typ av hantverkare, en kan måla, en kan flytta tegelstenar, en annan kan snickra, en annan kan bygga bilar osv... När du använder "tell application" så tänk dig att du står i en cirkel av alla dina hantverkare och du vänder dig mot en av dem och ber dem göra något. Man måste alltså tänka på att inte be målaren att snickra, och han som flyttar tegelstenar att bygga bilar osv...

Mycket bra analogi! Är även imponerad av dina andra svar i den här tråden, mycket pedagogiska och hjälpsamma!

Bra fråga. (Svar jag visste inte att "say" fanns i Applescript).
Jag har nu ett Applescript som säger

say "Fred is online"

men jag får fortfarande samma felmeddelande.

Om man escapar citattecknen i shellscriptet så får man
Expected “given”, “in”, “of”, expression, “with”, “without”, other parameter name, etc. but found unknown token.

Du måste "escapa" ett citattecken och behålla ett för att inuti applescript (som behöver citattecken för att innesluta do shellscriptkommandot och ett till som kommandot i shell vill ha...

do shell script "say \"Fred is online\""

@Taz_1999 Jag har iChat 4.0.2 (604) som kommer med 10.5.2.

Jag har inget tell kommando i scriptet. Detta följande är resultatet från Event Log i Script Editor. (Var lite oklar där i min första förklaring).

tell current application
	say "Fred is online"
end tell

@Taz_1999 Event loggen för det när det är "escapat" som du säger blir likadan som tidigare. Men det verkar som AppleScript fixade biffen vilket som, Applescript gör rätt men det verkar som iChat inte klarar att köra det hela utan error, shell script eller bara Applescript.

Ok, men är iChat "current application" då? Om du jobbar i Photoshop tex och din kompis kommer online, vet Photoshop, som blir måltavla för ditt tell, hur man gör en say blablabla?

Varför inte faktiskt styra ditt kommando och då faktiskt lägga till en tell som innebär att du verkligen vänder dig till rätt "hantverkare" och ber denne göra något specifikt?

tell application "System Events"
say "Fred is online"
end tell

Tack Taz_1999.

Gjorde som du sade, men det blev fortfarande samma fel.
Så för att inte ni skall behöva bugfixa mitt dåliga script och utbilda mig hela dagen så gjorde jag på ett annat sätt.

Man kan lägga till vilka ljudfiler som helst som skall spelas när ett "event" händer. Så jag skapade en "Fred is online" fil med

say -o fred.aiff fred is online

i terminalen och lade det på rätt ställe. Sedan kan iChat säga att Fred är online.

Tack för hjälpen båda två, jag lärde mig flera saker om AppleScript i dag!

Ursprungligen av bjelkeman:

Tack för hjälpen båda två, jag lärde mig flera saker om AppleScript i dag!

Varsågod! Det är inte alla som säger tack.

Vill du lära dig mera, så har jag en site om Applescript, man kan lära sig en del av kommentarerna i de script jag publicerat, länkarna mm.

Applescript-tips från Intelligent Mammals AB - Home (tvåspråkig)

Eller ställen fråga här i forumet förstås. Flera riktigt duktiga Applescriptare svarar på frågor här.

Try
say "Fred is online"
end try

Ger samma -1708 felmeddelande.

Då verkar det som att det inte ett AppleScript-fel, utan ett fel i iChat. Nu använder jag dock vare sig iChat eller Leopard så jag kan inte testa

Tack för berömmet. Roligt att höra.

En annan analogi jag använder mig av är bokhylla för att likna heriarkier i olika program. Man måste säga rätt sak till rätt grej även inom heriarkin inuti programmet, man kan inte säga till bokhyllan som helhet, "ge mig texten", man måste säga till tredje sidan i fjärde boken i femte hyllan i bokhyllan "ge mig texten", för att det är sidan som förstår kommandot, inte boken, inte hyllan, inte bokhyllan. Denna liknelse fungerar med tex Finder och mappar, den funkar med objekt i Indesign, den fungerar med fält i FileMaker Pro databaser osv osv.

  • Medlem
  • International user
  • 2008-06-24 17:35

Jag vill tipsa om PDF:n AppleScript For Absolute Starters.

Mycket bra introduktionsguide till Applescript enligt mig.

  • Medlem
  • Stockholm
  • 2008-06-28 22:11
Ursprungligen av bjelkeman:

Applescript, behandla output från shell script

Ville bara svara på frågan i rubriken för den som söker!

set returnValue to do shell script "ls"

Du får tillbaka en sträng (som Applescript kallar text eller ctxt), vilket följande visar:

display dialog (class of returnValue)

Vänligen, Ylan

  • Medlem
  • International user
  • 2008-06-29 02:38

För att faktiskt försöka lösa problemet utan att skapa en massa onödiga ljudfiler tycker jag du borde testa det här skriptet:

using terms from application "iChat"
	
	on buddy became available theBuddy
		set buddyName to name of theBuddy
		say buddyName & "is now available."
	end buddy became available
	
end using terms from

Det funkar finfint här. Sätter du det på en viss kontakt läser den upp den kontaktens namn när denne loggar in, annars kan du sätta det globalt på alla kontakter i Preferences.

För att förklara varför ditt andra skript inte funkade så beror det på att iChat vill att skripten ska fånga visa events som det skickar. Med andra ord, när någon loggar in så kör iChat ditt skript och berättar för det att någon har loggat in. För att allt ska fungera måste det finnas något i ditt skript som "lyssnar" på just det här, annars blir iChat på dåligt humör och slänger upp sina dumma 1708 fel.

I vårt skript är det "on buddy became available" biten som iChat anropar när skriptet körs så som du vill. Utan det går allt fel eftersom iChat anropar något som inte existerar.
Det finns en hel drös med sådana events i iChat, lättaste sättet att utforska dem är att öppna iChat som en Dictionary i Script Editor. Starta Script Editor och gå till File->Open Dictionary->iChat, kolla sen under "iChat Event Handler Suite". Ett annat tips när du ändå är inne i Dictionaryn är att ta en titt på vad objektet buddy innehåller (finns i "iChat Event Suite"),. Bland annat kan du få reda på deras status, statusmeddelande, för & efternamn och lite annat.

Bättre sent än aldrig

shandar: Sweet, det förklarade en hel del det där.

Kan också tillägga att "iChat Event Handler Suite" inte finns i den iChat som medföljer OS X 10.4.x, så ni som har 10.5 kan följa instruktionera ovan.

  • Medlem
  • International user
  • 2008-06-29 13:21
Ursprungligen av Taz_1999:

shandar: Sweet, det förklarade en hel del det där.

Kan också tillägga att "iChat Event Handler Suite" inte finns i den iChat som medföljer OS X 10.4.x, så ni som har 10.5 kan följa instruktionera ovan.

Men det måste ju finnas något liknande? Vad händer om du kör det här skriptet i 10.4?

shandar, shysst! Det fungerade precis som jag ville.

Fråga: Hur får man det att säga Buddy "Short Name" istället för handle. Chat handle kan vara rätt svårt att uttala på ett meningsfullt sätt.

Shandar: Jag har inte testat, men eftersom kommandot inte finns så går scriptet förmodligen inte att kompilera. Apple har alltså i den senare version av iChat lagt till funktioner i Applescript-stödet.

bjelkeman: Varför tar du inte och öppnar ordlistan för ichat och kollar vad det kan heta? Starta manusredigeraren > Arkiv > Öppna ordlista > iChat. Det finns sökruta mm. Enjoy!

Hmm manusredigeraren. Ah Script Editor. Ohh, en hel vista öppnar sig med saker som man kan gräva ner sig i. Tack för tippset! (Men jag har ju inte tid, vilket är anledningen jag har en Mac.... )

1
Bevaka tråden