osascript e AppleEvents

7

Ho registrato gli AppleEvents che vengono inviati da una finestra di Terminale. L'evento che il comando osascript invia al compilatore / interprete AppleScript non è stato registrato. Come mai?

Più in dettaglio, il seguente argomento consiste di tre ipotesi seguite dalla loro conclusione logica. Tuttavia, l'esperimento mostra che la conclusione è falsa. Quindi l'argomento è difettoso. Sfortunatamente, non so perché sia difettoso. Dove si rompe?

Ipotesi

  1. macOS viene fornito con un compilatore / interprete AppleScript incorporato installato come componente OSA.

  2. Il comando terminale osascript non "conosce" AppleScript. Quando viene passata una riga di codice AppleScript, la trasmette al compilatore / interprete AppleScript tramite l'architettura OSA inviando un AppleEvent.

  3. La seguente riga di codice, quando viene eseguita nel Terminale, farà sì che tutti gli AppleEvents inviati dai comandi che vengono eseguiti dalla stessa finestra Terminal in seguito vengano stampati nel Terminale:

    export AEDebugSends=1
    

Conclusione

Dopo aver eseguito i seguenti due comandi in una finestra di Terminale:

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

due AppleEvents devono essere stampati:

  1. Uno diretto da osascript al compilatore / interprete AppleScript per compilare ed eseguire il comando 'tell application "Finder" per attivare'.
  2. Uno diretto dal compilatore / interprete AppleScript al Finder per attivarsi.

Output effettivo

Viene stampato solo un AppleEvent, quello inviato al Finder:

AE2000 (4085 ): Sending an event:
------oo start of event oo------
aevt('misc'\'actv' transactionID=0 sourcePSN=[0x0,e00e "Finder"] timeout=7200 eventSource=3 { &'subj':null(), &'csig':magn(65536) })
------oo end of event oo------

    
posta Evan Aad 18.04.2017 - 21:35
fonte

1 risposta

3

tl; dr : i componenti della lingua sono solo dipendenze utilizzate dal file eseguibile e sono accessibili dalla shell senza eventi Apple.

A: il tuo argomento si interrompe in un paio di punti fatti nel numero 2.

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

D'accordo, non ha tutti i linguaggi che supporta autonomamente in un eseguibile. Tuttavia, è qui che entrano le dipendenze e quando la pensi in quel modo; non è troppo preoccupante che possa accedere alle dipendenze attraverso la shell come qualsiasi altra applicazione.

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

"When a scripting component executes a script, statements in the script may result in Apple events being sent to applications (developer.apple.com)".

L'eseguibile non si limita a utilizzare solo il codice all'interno di sé o una chiamata evento Apple. Simile a quasi tutti i processi o le applicazioni sulla macchina, si basa su varie librerie principali e in particolare utilizza i componenti osa del linguaggio installati sul sistema. Non usa gli eventi Apple per passare lo script al componente della lingua.

vedere le lingue supportate:
❯ osalang 
queste componenti linguistiche vivono qui:
❯ ls /System/Library/Components/


Poiché osascript può accedere direttamente ai componenti del linguaggio del tuo sistema attraverso la shell, non avrai mai visto un evento Apple attivato solo per elaborare / interpretare l'input dello script.

ad esempio, confronta questi due comandi in cui il primo utilizza il linguaggio AppleScript ma non interagisce con altre applicazioni:
❯ osascript -e 'set myVar to "hello" & "world"'
helloworld
e il secondo in cui diciamo al terminale di fare qualcosa:
❯ 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 quello che ha interagito con un'applicazione, non solo il linguaggio AppleScript, ha attivato un evento Apple.

Leggi questo articolo di nuovo e vedrai come questa esplosione si adatta ora. L'architettura OSA implementata tramite gli eventi Apple è il potente costrutto che consente l'automazione tra le applicazioni; ma l'interpretazione dello script di input è fatta semplicemente dal componente linguistico compatibile del sistema dietro le quinte.

    
risposta data 12.09.2017 - 19:52
fonte

Leggi altre domande sui tag