76 votes

Exécuter AppleScript depuis bash script

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

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

Mais qu'en est-il si je veux exécuter des commandes qui doivent être exécutées en séquence à 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 il permet d'expliquer ce que j'essaie de faire. Normalement, ces commandes devraient toutes être écrites sans leur échappement respectif. \ des personnages un peu partout et moins " autour de chaque commande. Je les placerais également à l'intérieur d'un .scpt fichier.

Une solution dont j'ai connaissance consiste à réécrire le script à l'aide de #!/usr/bin/osascript au lieu de bash et partir de là, mais je veux être capable de mélanger. J'ai trouvé que je peux tester pour un fichier script, s'il existe pour en créer un et ajouter chaque commande dont j'ai besoin à ce fichier et ensuite exécuter le fichier script requis à partir de bash, mais cela va également à l'encontre du but recherché.

Il n'y a aucun moyen pour qu'au milieu d'un fichier, je puisse échanger l'interpréteur de commandes utilisé avec l'interpréteur de commandes de l'utilisateur. shebang puis revenir après avoir exécuté les commandes nécessaires, n'est-ce pas ?

Tout commentaire sera le bienvenu.

78voto

Fuzzy Purple Monkey Points 702

L'argument en faveur de osascript -e peut contenir des nouvelles lignes :

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

Vous pouvez également spécifier plusieurs -e arguments :

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

Ou si vous utilisez un heredoc, bash interprète trois caractères ( \ , $ et ` ) entre <<END y END mais aucun caractère entre <<'END' y END .

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

Edit :

Puisque osascript peut fonctionner avec un heredoc (c'est-à-dire prendre l'entrée de /dev/stdin) alors on peut juste écrire le script comme un fichier entier et le précéder de la ligne shebang correcte :

#!/usr/bin/env osascript

set x to "a"
say x

Cela vous permet également de sauvegarder votre script de Apple en tant que programme réel dans ~/Applications/.app en utilisant la procédure suivante (en changeant pour le 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 script dans .../MacOS/ et les correspondances

0 votes

@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.

35voto

beroe Points 3151

Vous pouvez envelopper l'AppleScript brut dans <<EOD ... La dernière EOD qui signale la fin de l'entrée, doit se trouver en première position de la ligne.

(BTW, votre applescript semble manquer un end tell aprè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"

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X