Führen Sie AppleScript über das Bash-Skript aus

55

Wenn ich ein AppleScript innerhalb eines Bash-Skripts ausführen möchte, könnte ich eine Datei mit der Liste der Befehle aufrufen, die ich ausführen muss.

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

Was aber, wenn ich Befehle ausführen wollte, die innerhalb von bash nacheinander ausgeführt werden mussten?

Ein Beispiel wäre

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

Ich weiß, dass dies ein sehr weit hergeholtes Beispiel ist, aber es funktioniert, um zu erklären, was ich versuche zu tun. Normalerweise werden diese Befehle alle ohne die entsprechenden Escape- \Zeichen an allen Stellen und weniger "um jeden Befehl herum geschrieben. Ich hätte sie auch in einer .scptAkte.

Mir ist bewusst, dass es eine Lösung ist, das Skript mit #!/usr/bin/osascriptanstelle von bash umzuschreiben und von dort aus zu arbeiten, aber ich möchte in der Lage sein, zu mischen. Ich habe festgestellt, dass ich auf eine Skriptdatei testen kann, ob es eine gibt, um einen Befehl zu erstellen und jeden Befehl, den ich benötige, an diese Datei anzuhängen und dann die erforderliche Skriptdatei innerhalb von bash auszuführen.

Auf keinen Fall kann ich auf halbem Weg durch eine Datei die verwendete Shell mit der shebangZeile tauschen und dann zurück tauschen, nachdem ich die erforderlichen Befehle ausgeführt habe.

Jede Einsicht wäre mehr als willkommen.

Danijel-James W
quelle

Antworten:

57

Das Argument für osascript -ekann Zeilenumbrüche enthalten:

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

Sie können auch mehrere -eArgumente angeben :

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

Oder wenn Sie einen Heredoc verwenden, werden bashdrei Zeichen ( ,, und ) zwischen und interpretiert \, aber keine Zeichen zwischen und .$`<<ENDEND<<'END'END

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

Bearbeiten:

Da osascript mit einem Heredoc arbeiten kann (dh Eingaben von / dev / stdin nehmen), kann man das Skript einfach als ganze Datei schreiben und mit der richtigen Shebang-Zeile voranstellen:

#!/usr/bin/env osascript

set x to "a"
say x

Auf diese Weise können Sie Ihr Apple-Skript auch unter ~ / Applications / .app als aktuelles Programm speichern. Gehen Sie dazu wie folgt vor (ändern Sie den Namen Ihres Skripts):

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>

Stellen Sie sicher, dass sowohl die Skriptdatei in ... / MacOS / als auch die übereinstimmen

Lri
quelle
In der Tat hast du recht. Ich habe den ersten end tellTeil des Drehbuchs verpasst .
Danijel-James W
-eGibt es einen Grund, warum Sie das im HEREDOC-Beispiel nicht brauchen ?
Iconoclast
@iconoclast Laut der Manpage auf osascript handelt es sich um eine Skriptzeile. -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
Entschuldigung @uchuugaka, aber ich verstehe nicht, wie Ihre Antwort meine Frage beantwortet. In -e statement Enter one line of a scriptes ist ein -eGeschenk. Aber abgesehen davon, wird ein HEREDOC so behandelt, als wäre es eine einzelne Zeile?
iconoclast
21

Sie können das rohe AppleScript in <<EOD... einschließen. Das letzte EODSignal für das Ende der Eingabe muss an der ersten Position in der Zeile stehen.

(BTW, schien Apple ein zu fehlen end tellnach 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
quelle