¿Cómo invocar osascript 'Generic Scripting System'?

El comando de terminal osalangenumera los siguientes idiomas OSA instalados compatibles con osascript.

AppleScript
JavaScript
Generic Scripting System

Usar AppleScript o JavaScript funciona. Por ejemplo:

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

Sin embargo, algo como lo siguiente devuelve un error de "token desconocido encontrado".

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

¿Cómo se invoca osascriptel 'Sistema de secuencias de comandos genérico' desde la línea de comando para algunas secuencias de comandos que no son de AppleScript ni de JavaScript ... sin usar ningún AppleScript o JavaScript (intermedio)? ¿Es esto posible?

Respuestas (2)

De acuerdo con las partes internas del sistema OS X, el "Sistema de secuencias de comandos genérico" es una clase genérica que contiene los dos tipos de secuencias de comandos compatibles:

  • AppleScript
  • JavaScript

No es una tercera opción que agrega uno o más dialectos nuevos, sino un contenedor para contener los existentes. Esto se explica indirectamente en la documentación de Apple: enumeran los dos idiomas y no mencionan la clase contenedora (o el nombre que sea):

Si necesitara otros idiomas, llamaría a AppleScript "do shell script..." para luego llamar a cualquier ejecutable de shell que envíe Apple o que haya instalado ( bash, sh, python, swift, perl, ...).

entonces, aparentemente, el "Sistema de secuencias de comandos genérico" enumerado por osalangno es una puerta de entrada más allá de AppleScript y JavaScript disponibles. Después de su respuesta, pensé en verificar el Monitor de actividad (botón de información, Abrir archivos y puertos) con la sesión interactiva osascript -l 'Generic Scripting System' -i. ... el interactivo "Genérico" va directamente a los recursos del marco AppleScript.

Lo que osalangrealmente está haciendo es hablar con el Administrador de componentes y devolver todos los componentes de tipo osa (el espacio al final es intencional, ya que este es un OSType, también conocido como FourCC). Component Manager es un marco de complemento de software que se introdujo originalmente en Classic Mac OS, primero para que lo usara QuickTime, y luego fue muy utilizado por muchos componentes de Classic Mac OS, entre otros Open Scripting Architecture (OSA). En OS X / macOS (y especialmente en versiones recientes), ha quedado obsoleto y se usa mucho menos que el Mac OS clásico, ya que ahora hay alternativas mucho mejores (como las clases de Objective C). Las únicas dos cosas en las versiones recientes de macOS que aún usan el Administrador de componentes son OSA y ciertas API de audio. (Por el contrario, en Classic Mac OS se usó para muchas otras cosas, como QuickDraw GX y ColorSync, que desde entonces han sido reemplazadas por tecnologías más nuevas).

Entonces, macOS viene con tres osa tipos de componentes listos para usar: ascr(AppleScript), jscr(JavaScript) y scpt(Sistema de secuencias de comandos genérico). Los desarrolladores pueden registrar componentes adicionales para implementar más lenguajes OSA, aunque eso rara vez se hace. Lo que scptsí es que no es realmente un lenguaje, sino una capa de programación con la que los desarrolladores pueden hablar en lugar de tener que hablar directamente con los componentes de secuencias de comandos subyacentes, como ascry jscr. Piense en ello como un intermediario, un intermediario. Si observa el SDK de macOS, puede encontrar su API declarada en OSAGeneric.hla que se puede encontrar en el marco OpenScripting. Una de las funciones que agrega a los componentes subyacentes del lenguaje OSA es el enrutamiento de .scptarchivos. Básicamente, un programa (comoosascripto "Editor de scripts") puede llamar a una API ( OSALoad) para cargar un .scptarchivo. Hay un campo en el encabezado del archivo o en el tráiler que indica qué lenguaje de secuencias de comandos real se está utilizando. El sistema de secuencias de comandos genérico contiene el código para interpretar el encabezado o el tráiler del archivo y luego envía el contenido del .scptarchivo al motor de lenguaje apropiado. Por lo tanto, hablar con el "Sistema de secuencias de comandos genérico", en lugar de hacerlo directamente con los motores de lenguaje subyacentes, es realmente importante para los desarrolladores si desean admitir la carga de .scptarchivos en cualquier idioma.