Ich habe die AppleEvents protokolliert, die von einem Terminalfenster gesendet werden. Das Ereignis, das der osascript
Befehl 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
macOS verfügt über einen integrierten AppleScript-Compiler / Interpreter, der als OSA-Komponente installiert ist.
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.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:
- Einer, der vom
osascript
AppleScript-Compiler / Interpreter geleitet wird, um den Befehl 'Tell Application "Finder" zum Aktivieren' zu kompilieren und auszuführen. - 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 ------
quelle
Antworten:
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."
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: Diese Sprachkomponenten leben hier:
Vergleichen Sie beispielsweise diese beiden Befehle, bei denen der erste die AppleScript-Sprache verwendet, aber nicht mit anderen Anwendungen interagiert: und das zweite, wo wir Terminal anweisen, etwas zu tun:Da
osascript
Sie 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.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.
quelle