osascript und AppleEvents

6

Ich habe die AppleEvents protokolliert, die von einem Terminalfenster gesendet werden. Das Ereignis, das der osascriptBefehl an den AppleScript-Compiler / Interpreter sendet, wurde nicht protokolliert. Woher?

Im Einzelnen besteht das folgende Argument aus drei Hypothesen, denen ihre logische Schlussfolgerung folgt. Das Experiment zeigt jedoch, dass die Schlussfolgerung falsch ist. Daher ist das Argument fehlerhaft. Leider weiß ich nicht, warum es fehlerhaft ist. Wo bricht es?

Hypothesen

  1. macOS verfügt über einen integrierten AppleScript-Compiler / Interpreter, der als OSA-Komponente installiert ist.

  2. Der Terminal-Befehl osascript"kennt" AppleScript nicht. Wenn eine Zeile AppleScript-Code übergeben wird, wird dieser über die OSA-Architektur an den AppleScript-Compiler / Interpreter weitergeleitet, indem ein AppleEvent gesendet wird.

  3. Wenn die folgende Codezeile im Terminal ausgeführt wird, werden alle AppleEvents, die von Befehlen gesendet werden, die anschließend im selben Terminalfenster ausgeführt werden, im Terminal ausgedruckt:

    export AEDebugSends=1

Fazit

Nachdem Sie die folgenden zwei Befehle in einem Terminalfenster ausgeführt haben:

export AEDebugSends=1
osascript -e 'tell application "Finder" to activate'

Es sollten zwei AppleEvents ausgedruckt werden:

  1. Einer, der vom osascriptAppleScript-Compiler / Interpreter geleitet wird, um den Befehl 'Tell Application "Finder" zum Aktivieren' zu kompilieren und auszuführen.
  2. Einer, der vom AppleScript-Compiler / Interpreter an Finder weitergeleitet wurde, um sich selbst zu aktivieren.

Tatsächliche Ausgabe

Es wird nur ein AppleEvent ausgedruckt, das an den Finder gesendet wurde:

AE2000 (4085): Senden eines Ereignisses:
------ oo Beginn des Ereignisses oo ------
aevt ('misc' \ 'actv' transactionID = 0 sourcePSN = [0x0, e00e "Finder"] timeout = 7200 eventSource = 3 {& 'subj': null (), & 'csig': magn (65536)})
------ oo Ende des Ereignisses oo ------

Evan Aad
quelle
In "Hypothese 3)" schreiben Sie :. . . bewirkt, dass alle AppleEvents von Befehlen gesendet werden. . . "osascript" ist KEIN bloßer Befehl. Außerdem schreibst du :. . . Nachdem Sie die folgenden zwei Befehle in einem Terminalfenster ausgeführt haben. . . Ich leugne dies ... Ich hatte hier eine Antwort, die Details erklärt, aber ich wurde von einem Ungläubigen ignorant abgewählt, also habe ich diese Antwort gelöscht. STILL: Es ist ein Fehler zu glauben, dass "osascript" ein Befehl von Terminal ist. "osascript" ist ein eigener Prozess, der lediglich im Terminal aufgerufen wird. Starten Sie ein AppleScript mit "osascript", lassen Sie es "jeden Prozess"
auflisten

Antworten:

3

tl; dr : Sprachkomponenten sind nur Abhängigkeiten, die von der ausführbaren Datei verwendet werden und auf die über die Shell ohne Apple-Ereignisse zugegriffen werden kann.

A: Ihr Argument bricht an einigen Punkten in Nummer 2 ab.

ein. "The Terminal command osascript does not "know" AppleScript."

Einverstanden ist, dass nicht alle von ihm unterstützten Sprachen in einer ausführbaren Datei enthalten sind. Hier kommen jedoch Abhängigkeiten ins Spiel, und wenn Sie es so sehen; Es ist nicht allzu beunruhigend, dass es wie jede andere Anwendung über Ihre Shell auf Abhängigkeiten zugreifen kann.

b. "it passes it on to the AppleScript compiler/interpreter via the OSA architecture by sending out an AppleEvent."

"Wenn eine Skriptkomponente ein Skript ausführt, können Anweisungen im Skript dazu führen, dass Apple-Ereignisse an Anwendungen gesendet werden ( developer.apple.com )."

Die ausführbare Datei ist nicht darauf beschränkt, nur Code in sich selbst oder einen Apple-Ereignisaufruf zu verwenden. Ähnlich wie bei fast jedem Prozess oder jeder Anwendung auf Ihrem Computer basiert es auf verschiedenen Kernbibliotheken und verwendet speziell die auf Ihrem System installierten osa-Sprachkomponenten. Apple-Ereignisse werden nicht zum Übergeben Ihres Skripts an die Sprachkomponente verwendet.

siehe unterstützte Sprachen:
 osalang 
Diese Sprachkomponenten leben hier:
 ls /System/Library/Components/


Da osascriptSie direkt über die Shell auf die Sprachkomponenten Ihres Systems zugreifen können, wurde nie ein Apple-Ereignis ausgelöst, das nur zum Verarbeiten / Interpretieren der Skripteingabe ausgelöst wurde.

Vergleichen Sie beispielsweise diese beiden Befehle, bei denen der erste die AppleScript-Sprache verwendet, aber nicht mit anderen Anwendungen interagiert:
 osascript -e 'set myVar to "hello" & "world"'
helloworld
und das zweite, wo wir Terminal anweisen, etwas zu tun:
 osascript -e 'tell application "Terminal" to do script ("echo helloworld;")'
AE2000 (63917 ): Sending an event:
------oo start of event oo------
aevt('core'\'dosc' transactionID=0 sourcePSN=[0x0,dd7dd7 "Terminal"] timeout=7200 eventSource=3 { '----':utxt('utxt'(TEXT("echo helloworld;"))), &'subj':null(), &'csig':magn(65536) })
------oo  end of event  oo------
tab 1 of window id 32644

Nur derjenige, der mit einer Anwendung interagierte, nicht nur die AppleScript-Sprache selbst, löste ein Apple-Ereignis aus.

Lesen Sie diesen Artikel noch einmal durch und Sie werden sehen, wie diese Erklärung jetzt passt. Die über Apple-Ereignisse implementierte OSA-Architektur ist das leistungsstarke Konstrukt, das die Automatisierung zwischen Anwendungen ermöglicht. Die Interpretation des Eingabeskripts selbst erfolgt jedoch nur durch die kompatible Sprachkomponente Ihres Systems hinter den Kulissen.

Eric Jones
quelle