Esegui AppleScript dallo script bash


55

Se volessi eseguire un AppleScript da uno script bash, potrei chiamare un file con l'elenco dei comandi che devo eseguire.

#!/bin/bash
{some commands}
osascript file.scpt
{other commands}

E se volessi eseguire comandi che dovevano essere eseguiti in sequenza da bash?

Un esempio sarebbe

#!/bin/bash
echo
echo This will open Google Chrome in Kiosk mode
  osascript -e "tell application \"Google Chrome\""
  osascript -e "activate"
  osascript -e     "tell application \"System Events\""
  osascript -e         "key down {command}"
  osascript -e         "key down {shift}"
  osascript -e         "keystroke \"f\""
  osascript -e         "key up {shift}"
  osascript -e         "key up {command}"
  osascript -e     "end tell"
echo "Google Chrome is now open in Kiosk Mode"

So che questo è un esempio molto inverosimile, ma funziona per spiegare cosa sto cercando di fare. Normalmente, quei comandi sarebbero tutti scritti senza i rispettivi \caratteri di escape in tutto il luogo e meno "attorno a ciascun comando. Li avrei anche all'interno di un .scptfile.

Una soluzione di cui sono a conoscenza è quella di riscrivere lo script usando al #!/usr/bin/osascriptposto di bash e andare da lì, ma voglio essere in grado di fondere. Ho scoperto che posso testare un file di script, se esiste per crearne uno e aggiungere ogni comando di cui ho bisogno a quel file e quindi eseguire il file di script richiesto da bash, ma ciò vanifica anche lo scopo.

A metà strada attraverso un file, posso scambiare la shell in uso con la shebanglinea e poi scambiare indietro dopo aver eseguito i comandi necessari, vero?

Qualsiasi intuizione sarebbe più che benvenuta.

Risposte:


57

L'argomento per osascript -epuò contenere newline:

osascript -e 'set x to "a"
say x'

Puoi anche specificare più -eargomenti:

osascript -e 'set x to "a"' -e 'say x'

Oppure, se si utilizza un heredoc, bashinterpreta tre personaggi ( \, $, e `), tra <<ENDe END, ma senza caratteri tra <<'END'e END.

osascript <<'END'
set x to "a"
say x
END

Modificare:

Poiché osascript può funzionare con un heredoc (ovvero prendere input da / dev / stdin), si può semplicemente scrivere lo script come un intero file e anteporre con la riga shebang corretta:

#!/usr/bin/env osascript

set x to "a"
say x

Questo ti consente anche di salvare il tuo script apple come un vero programma in ~ / Applicazioni / .app usando la seguente procedura (cambiando per il nome del tuo script):

mkdir -p ~/Applications/<APP_NAME>.app/Contents/MacOS
touch ~/Applications/<APP_NAME>.app/Contents/MacOS/<APP_NAME>
open -A TextEdit ~/Applications/<APP_NAME>.app/Contents/MacOS/<APP_NAME>

Assicurati che sia il file di script in ... / MacOS / sia le corrispondenze


In effetti hai ragione. Ho perso il primo end telldella sceneggiatura.
Danijel-James W

Per quale motivo non hai bisogno -edell'esempio HEREDOC?
iconoclasta il

@iconoclast Per la pagina man su osascript è una riga di script. -e statement Enter one line of a script. If -e is given, osascript will not look for a filename in the argument list. Multiple -e options may be given to build up a multi-line script. Because most scripts use characters that are special to many shell programs (for example, AppleScript uses single and double quote marks, ``('', ``)'', and ``*''), the statement will have to be correctly quoted and escaped to get it past the shell intact.
Uchuugaka,

Scusa @uchuugaka, ma non riesco a capire come la tua risposta risponda alla mia domanda. In c'è un presente. Ma a parte questo, un HEREDOC è trattato come se fosse una linea singola? -e statement Enter one line of a script-e
iconoclasta il

21

Puoi avvolgere l'AppleScript non elaborato in <<EOD... L'ultimo EODsegnale che indica la fine dell'input deve arrivare nella prima posizione nella riga.

(A proposito, il tuo matto sembrava mancare un end telldopo activate...)

#!/bin/bash
osascript <<EOD
  tell application "Google Chrome"
      activate
  end tell
  tell application "System Events"
      key down {command}
      key down {shift}
      keystroke "f"
      key up {shift}
      key up {command}
  end tell
EOD

echo "Google Chrome is now open in Kiosk Mode"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.