Jalankan AppleScript dari skrip bash

55

Jika saya ingin menjalankan AppleScript dari dalam skrip bash saya bisa memanggil file dengan daftar perintah yang saya perlukan untuk mengeksekusi.

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

Namun, bagaimana jika saya ingin menjalankan perintah yang perlu dijalankan secara berurutan dari dalam bash?

Contohnya adalah

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

Saya tahu ini adalah contoh yang sangat jauh, tetapi berfungsi untuk menjelaskan apa yang saya coba lakukan. Biasanya, perintah-perintah itu semua akan ditulis tanpa \karakter melarikan diri masing-masing di semua tempat dan kurang di "sekitar setiap perintah. Saya juga memiliki mereka di dalam .scptfile.

Solusi yang saya tahu, adalah menulis ulang skrip menggunakan #!/usr/bin/osascriptalih-alih bash dan pergi dari sana, tapi saya ingin bisa berbaur. Saya telah menemukan bahwa saya dapat menguji file skrip, jika memang ada untuk membuat satu dan menambahkan setiap perintah saya perlu file itu dan kemudian menjalankan file skrip yang diperlukan dari dalam bash, tetapi itu juga mengalahkan tujuannya.

Tidak ada cara bahwa pertengahan jalan melalui file, saya bisa menukar shell yang digunakan dengan shebanggaris dan kemudian bertukar kembali setelah saya menjalankan perintah yang diperlukan, bukan?

Wawasan apa pun akan lebih dari sekadar sambutan.

Danijel-James W
sumber

Jawaban:

57

Argumen untuk osascript -edapat berisi baris baru:

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

Anda juga dapat menentukan beberapa -eargumen:

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

Atau jika Anda menggunakan heredoc sebuah, bashmenafsirkan tiga karakter ( \, $, dan `) antara <<ENDdan ENDtetapi tidak ada karakter antara <<'END'dan END.

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

Sunting:

Karena osascript dapat beroperasi dengan heredoc (yaitu mengambil input dari / dev / stdin) maka seseorang dapat menulis skrip sebagai keseluruhan file dan menambahkan dengan baris shebang yang benar:

#!/usr/bin/env osascript

set x to "a"
say x

Ini juga memungkinkan Anda untuk menyimpan skrip apel Anda sebagai program aktual di ~ / Applications / .app menggunakan prosedur berikut (mengubah nama skrip Anda):

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>

Pastikan bahwa kedua file skrip di ... / MacOS / dan cocok

Lri
sumber
Memang Anda benar. Saya melewatkan end tellnaskah pertama.
Danijel-James W
Adakah alasan Anda tidak memerlukan -econtoh HEREDOC?
iconoclast
@iconoclast Per halaman manual pada osascript itu adalah satu baris skrip. -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
Maaf @uchuugaka, tapi saya gagal memahami bagaimana jawaban Anda menjawab pertanyaan saya. Di -e statement Enter one line of a scriptsana adalah sebuah -ehadir. Namun terlepas dari itu, apakah HEREDOC diperlakukan seolah-olah hanya satu baris?
iconoclast
21

Anda dapat membungkus AppleScript mentah di <<EOD... Yang terakhir EODmenandakan akhir input harus datang pada posisi pertama di baris.

(BTW, applescript Anda sepertinya hilang end tellsetelah 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
sumber