Esegui AppleScript dallo script di bash

48

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

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

Che cosa, tuttavia, se volessi eseguire comandi che dovevano essere eseguiti in sequenza da bash?

Un esempio potrebbe essere

#!/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 esagerato, ma funziona per spiegare cosa sto cercando di fare. Normalmente, quei comandi verrebbero scritti tutti senza i rispettivi escape \ caratteri in tutto il luogo e meno " attorno a ciascun comando. Li avrei anche contenuti in un file .scpt .

Una soluzione di cui sono a conoscenza, è riscrivere lo script usando #!/usr/bin/osascript invece 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 che mi serve a quel file e quindi eseguire il file di script richiesto da bash, ma anche quello lo sconfigge.

Non c'è modo che a metà strada attraverso un file, posso scambiare la shell che viene utilizzata con la riga shebang e poi tornare indietro dopo aver eseguito i comandi necessari, c'è?

Qualsiasi intuizione sarebbe più che benvenuta.

    
posta Danijel-James W 28.09.2013 - 18:57
fonte

2 risposte

48

L'argomento per osascript -e può contenere nuove righe:

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

Puoi anche specificare più% argomenti% co_de:

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

O se usi un heredoc, -e interpreta tre caratteri ( bash , \ e $ ) tra ' e <<END ma nessun carattere tra END e <<'END' .

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

Modifica:

Dato che osascript può operare con un heredoc (cioè prendere input da / dev / stdin) allora si può semplicemente scrivere lo script come un intero file e anteporre la linea corretta shebang:

#!/usr/bin/env osascript

set x to "a"
say x

Questo ti consente anche di salvare lo script Apple come un programma reale in ~ / Applicazioni / .app usando la seguente procedura (cambiando 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 / e le corrispondenze

    
risposta data 28.09.2013 - 22:09
fonte
19

Puoi racchiudere AppleScript non elaborato in <<EOD ... L'ultima EOD che segnala la fine dell'input deve trovarsi nella prima posizione della riga.

(A proposito, il tuo applescript sembrava mancare un end tell dopo 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"
    
risposta data 28.09.2013 - 20:52
fonte

Leggi altre domande sui tag