Exécuter AppleScript à partir du script bash

55

Si je voulais exécuter un AppleScript à partir d'un script bash, je pouvais appeler un fichier avec la liste des commandes à exécuter.

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

Quoi, cependant, si je voulais exécuter des commandes qui devaient être exécutées dans l'ordre à partir de bash?

Un exemple serait

#!/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"

Je sais que cet exemple est très tiré par les cheveux, mais cela explique ce que j'essaie de faire. Normalement, ces commandes seraient toutes écrites sans leurs \caractères d' échappement respectifs et moins "autour de chaque commande. Je les aurais aussi à l'intérieur d'un .scptfichier.

Une solution à ma connaissance est de réécrire le script en utilisant #!/usr/bin/osascriptbash et ensuite à partir de là, mais je veux pouvoir mélanger. J'ai constaté que je pouvais tester un fichier de script. S'il existait, il en créerait un et ajouterait chaque commande dont j'avais besoin à ce fichier, puis exécuterait le fichier de script requis à partir de bash, mais cela irait également à l'encontre du but recherché.

Il n'y a aucun moyen de passer d'un fichier à un autre. Je peux échanger le shell utilisé avec la shebangligne, puis revenir après avoir exécuté les commandes nécessaires, n'est-ce pas?

Toute idée serait plus que bienvenue.

Danijel-James W
la source

Réponses:

57

L'argument pour osascript -epeut contenir des nouvelles lignes:

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

Vous pouvez également spécifier plusieurs -earguments:

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

Ou si vous utilisez un heredoc, bashinterprète trois personnages ( \, $et `) entre <<ENDet ENDmais pas de caractères entre <<'END'et END.

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

Modifier:

Puisque osascript peut fonctionner avec un heredoc (c'est-à-dire prendre les entrées de / dev / stdin), il suffit d'écrire le script dans un fichier complet et d'y ajouter la bonne ligne de shebang:

#!/usr/bin/env osascript

set x to "a"
say x

Cela vous permet également de sauvegarder votre script Apple en tant que programme réel dans ~ / Applications / .app à l'aide de la procédure suivante (modification du nom de votre 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>

Assurez-vous que le fichier de script dans ... / MacOS / et les correspondances

Lri
la source
En effet, vous avez raison. J'ai raté le premier end telldu script.
Danijel-James W
Une raison pour laquelle vous n'avez pas besoin -ede l'exemple HEREDOC?
iconoclaste le
@iconoclast Selon la page de manuel sur osascript, il s'agit d'une ligne de 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
Désolé @uchuugaka, mais je n'arrive pas à comprendre comment votre réponse répond à ma question. Dans -e statement Enter one line of a scriptil y a un -ecadeau. Mais à part cela, un HEREDOC est-il traité comme s'il s'agissait d'une seule ligne?
iconoclaste
21

Vous pouvez envelopper le AppleScript brut dans <<EOD... Le dernier EODsignal indiquant que la fin de la saisie doit venir à la première position de la ligne.

(BTW, votre pomme de texte semblait manquer un end tellaprès 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"
Beroe
la source