Uruchom AppleScript ze skryptu bash

55

Gdybym chciał uruchomić AppleScript z poziomu skryptu bash, mógłbym wywołać plik z listą poleceń, które muszę wykonać.

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

Co jednak, jeśli chciałbym uruchamiać polecenia, które musiały być uruchamiane sekwencyjnie z poziomu bash?

Przykładem może być

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

Wiem, że jest to bardzo naciągany przykład, ale działa, aby wyjaśnić, co próbuję zrobić. Zwykle wszystkie te polecenia byłyby pisane bez odpowiednich \znaków ucieczki w każdym miejscu, a mniej "wokół każdego polecenia. Chciałbym też mieć je w .scptpliku.

Znanym mi rozwiązaniem jest przepisanie skryptu za pomocą #!/usr/bin/osascriptzamiast bash i przejście stamtąd, ale chcę mieć możliwość łączenia. Przekonałem się, że mogę przetestować plik skryptu, jeśli istnieje, aby go utworzyć i dołączyć każdą komendę, której potrzebuję, do tego pliku, a następnie wykonać wymagany plik skryptu z poziomu bash, ale to także nie udaje się.

Nie ma możliwości, aby w połowie pliku można było zamienić powłokę używaną z shebanglinią, a następnie z powrotem po wykonaniu niezbędnych poleceń, prawda?

Każdy wgląd byłby więcej niż mile widziany.

Danijel-James W.
źródło

Odpowiedzi:

57

Argument dla osascript -emoże zawierać znaki nowej linii:

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

Możesz także podać wiele -eargumentów:

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

Lub jeśli używasz heredoc, bashinterpretuje trzy znaki ( \, $, i `) pomiędzy <<ENDa ENDjednak żadnych znaków pomiędzy <<'END'i END.

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

Edytować:

Ponieważ osascript może działać z heredoc (tzn. Pobierać dane z / dev / stdin), można po prostu napisać skrypt jako cały plik i poprzedzić go poprawną linią shebang:

#!/usr/bin/env osascript

set x to "a"
say x

Umożliwia to również zapisanie skryptu Apple jako rzeczywistego programu w ~ / Applications / .app przy użyciu następującej procedury (zmiana nazwy skryptu):

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>

Upewnij się, że zarówno plik skryptu w ... / MacOS /, jak i dopasowania

Lri
źródło
Rzeczywiście masz rację. Brakowało mi pierwszego end tellskryptu.
Danijel-James W
Czy jest jakiś powód, dla którego nie potrzebujesz -eprzykładu HEREDOC?
iconoclast
@iconoclast Na stronie podręcznika osascript jest to jeden wiersz skryptu. -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
Przepraszam @uchuugaka, ale nie rozumiem, w jaki sposób twoja odpowiedź odpowiada na moje pytanie. W -e statement Enter one line of a scripttam jest-e obecny. Ale poza tym, czy HEREDOC jest traktowany tak, jakby był pojedynczą linią?
iconoclast
21

Możesz owinąć nieprzetworzony AppleScript w <<EOD... Ostatni EODsygnał końca wejścia musi znajdować się na pierwszej pozycji w linii.

(BTW, wydawało się, że brakuje twojego skryptu jabłkowego end tellpo 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
źródło