osascript y AppleEvents

6

He registrado los AppleEvents que se envían desde una ventana de Terminal. El evento que el comando osascript envía al compilador / intérprete de AppleScript no se registró. ¿Cómo es que?

En mayor detalle, el siguiente argumento consta de tres hipótesis seguidas por su conclusión lógica. Sin embargo, el experimento muestra que la conclusión es falsa. De ahí que el argumento sea defectuoso. Desafortunadamente, no sé por qué es defectuoso. ¿Dónde se rompe?

Hipótesis

  1. macOS viene con un compilador / intérprete AppleScript incorporado que se instala como un componente OSA.

  2. El comando de Terminal osascript no "sabe" AppleScript. Cuando se pasa una línea de código AppleScript, se pasa al compilador / intérprete de AppleScript a través de la arquitectura OSA enviando un AppleEvent.

  3. La siguiente línea de código, cuando se ejecuta en la Terminal, hará que todos los AppleEvents enviados por comandos que se ejecutan desde la misma ventana de Terminal luego se impriman en la Terminal:

    export AEDebugSends=1
    

Conclusión

Después de ejecutar los dos comandos siguientes en una ventana de Terminal:

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

deben imprimirse dos AppleEvents:

  1. Uno dirigido desde osascript al compilador / intérprete de AppleScript para compilar y ejecutar el comando 'decirle a la aplicación "Finder" que active'.
  2. Uno dirigido desde el compilador / intérprete de AppleScript al Finder para activarse.

Salida real

Sólo se imprime un AppleEvent, el que se envía al Finder:

  

AE2000 (4085): Enviando un evento:
  ------ oo inicio del evento oo ------
  aevt ('misc' \ 'actv' transactionID = 0 sourcePSN = [0x0, e00e "Finder"] timeout = 7200 eventSource = 3 {& 'subj': null (), & 'csig': magn (65536) )
  ------ oo fin del evento oo ------

    
pregunta Evan Aad 18.04.2017 - 21:35

1 respuesta

2

tl; dr : los componentes de lenguaje son solo dependencias utilizadas por el ejecutable y se puede acceder a través del shell sin eventos de Apple.

A: Su argumento se rompe en un par de puntos en el número 2.

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

De acuerdo, no tiene todos los lenguajes que admite en un ejecutable. Sin embargo, ahí es donde entran las dependencias, y cuando lo piensas de esa manera; no es demasiado preocupante que pueda acceder a las dependencias a través de su shell como cualquier otra aplicación.

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

  

"Cuando un componente de secuencias de comandos ejecuta una secuencia de comandos, las declaraciones en la secuencia de comandos pueden hacer que los eventos de Apple se envíen a las aplicaciones ( developer.apple.com )".

El ejecutable no se limita a usar solo un código dentro de sí mismo o una llamada de evento de Apple. Similar a casi todos los procesos o aplicaciones en su máquina, se basa en varias bibliotecas centrales y, específicamente, utiliza los componentes de lenguaje osa instalados en su sistema. No utiliza eventos de Apple para pasar su script al componente de idioma.

ver idiomas soportados:
❯ osalang 
estos componentes del lenguaje viven aquí:
❯ ls /System/Library/Components/


Como osascript puede acceder a los componentes de idioma de su sistema directamente a través del shell, nunca verá un evento de Apple activado solo para procesar / interpretar la entrada del script.

por ejemplo, compare estos dos comandos donde el primero utiliza el lenguaje AppleScript pero no interactúa con ninguna otra aplicación:
❯ osascript -e 'set myVar to "hello" & "world"'
helloworld
Y el segundo donde le decimos a la terminal que haga algo:
❯ 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

Solo el que interactuó con una aplicación, no solo el lenguaje AppleScript en sí, desencadenó un evento de Apple.

Lea sobre esto artículo de nuevo y verás cómo encaja esta explicación ahora. La arquitectura OSA implementada a través de eventos de Apple es la construcción poderosa que permite la automatización entre aplicaciones; pero la interpretación del script de entrada en sí solo la realiza el componente de lenguaje compatible de su sistema detrás de escena.

    
respondido por el Eric Jones 12.09.2017 - 19:52

Lea otras preguntas en las etiquetas