Wie rufe ich das osascript 'Generic Scripting System' auf?

Der Terminalbefehl osalanglistet die folgenden installierten OSA-Sprachen auf, die von unterstützt werden osascript.

AppleScript
JavaScript
Generic Scripting System

Die Verwendung von AppleScript oder JavaScript funktioniert. Zum Beispiel:

osascript -l JavaScript \
    -e 'Application("iTunes").currentTrack.name()'

Etwas wie das Folgende gibt jedoch einen Fehler „unbekanntes Token gefunden“ zurück.

osascript -l 'Generic Scripting System' \
    -e '#!/bin/bash' \
    -e 'echo $HOME'

Wie ruft man osascript'Generic Scripting System' von der Befehlszeile für einige Nicht-AppleScript-, Nicht-JavaScript-Skripte auf ... ohne (Zwischen-)AppleScript oder JavaScript zu verwenden? Ist das überhaupt möglich?

Antworten (2)

Laut OS X-Systeminterna ist das "Generic Scripting System" eine generische Klasse, die die beiden unterstützten Skriptvarianten enthält:

  • AppleScript
  • JavaScript

Es ist keine dritte Option, die einen oder mehrere neue Dialekte hinzufügt, sondern ein Container, der die vorhandenen enthält. Dies wird indirekt in Apples Dokumentation erklärt - sie listen die beiden Sprachen auf und erwähnen nicht die Wrapper-Klasse (oder was auch immer ihr richtiger Name ist):

Wenn Sie andere Sprachen benötigen, würde ich AppleScript "do Shell Script ..." nennen, um dann die ausführbare Shell-Datei aufzurufen, die von Apple geliefert oder von Ihnen installiert wurde ( bash, sh, python, swift, perl, ...).

anscheinend osalangist das von aufgeführte "Generic Scripting System" kein Gateway jenseits des verfügbaren AppleScript & JavaScript. Nach Ihrer Antwort dachte ich, den Aktivitätsmonitor (Informationsschaltfläche, Dateien und Ports öffnen) mit der interaktiven Sitzung zu überprüfen osascript -l 'Generic Scripting System' -i. ... das interaktive "Generic" geht direkt zu den AppleScript-Framework-Ressourcen.

Was osalangtatsächlich getan wird, ist, mit dem Komponenten-Manager zu sprechen und alle Komponenten des Typs zurückzugeben osa (das Leerzeichen am Ende ist beabsichtigt, da dies ein OSType alias FourCC ist). Der Komponenten-Manager ist ein Software-Plug-in-Framework, das ursprünglich auf Classic Mac OS eingeführt wurde, zunächst für die Verwendung durch QuickTime, und später von vielen Classic Mac OS-Komponenten stark genutzt wurde, unter anderem von Open Scripting Architecture (OSA). In OS X / macOS (und insbesondere in neueren Versionen) ist es veraltet und wird weit weniger verwendet als das klassische Mac OS, da es jetzt viel bessere Alternativen gibt (z. B. Objective C-Klassen). Die einzigen zwei Dinge in neueren macOS-Versionen, die noch den Komponenten-Manager verwenden, sind OSA und bestimmte Audio-APIs. (Im Gegensatz dazu wurde es in Classic Mac OS für viele andere Dinge verwendet, wie QuickDraw GX und ColorSync, die inzwischen durch neuere Technologien ersetzt wurden.)

macOS wird also osa standardmäßig mit drei Typkomponenten geliefert: ascr(AppleScript), jscr(JavaScript) und scpt(Generic Scripting System). Entwickler können zusätzliche Komponenten registrieren, um weitere OSA-Sprachen zu implementieren, obwohl dies selten geschieht. Es scptist eigentlich keine Sprache, sondern eine Programmierschicht, mit der Entwickler sprechen können, anstatt direkt mit den zugrunde liegenden Skriptkomponenten wie ascrund sprechen zu müssen jscr. Betrachten Sie es wie einen Mittelsmann, einen Vermittler. Wenn Sie sich das macOS SDK ansehen, finden Sie dessen API deklariert, OSAGeneric.hdie im OpenScripting-Framework zu finden ist. Eines der Features, das es den zugrunde liegenden OSA-Sprachkomponenten hinzufügt, ist das Routing von .scptDateien. Grundsätzlich ist ein Programm (wie zosascriptoder "Script Editor") kann eine API ( OSALoad) aufrufen, um eine .scptDatei zu laden. Es gibt ein Feld im Datei-Header oder -Trailer, das angibt, welche aktuelle Skriptsprache verwendet wird. Das Generic Scripting System enthält den Code zum Interpretieren dieses Datei-Headers/Trailers und sendet dann den Inhalt der .scptDatei an die entsprechende Sprach-Engine. Daher ist es für Entwickler tatsächlich wichtig, mit "Generic Scripting System" zu sprechen, anstatt direkt mit den zugrunde liegenden Sprach-Engines, wenn sie das Laden von Dateien in einer beliebigen Sprache unterstützen möchten .scpt.