AppleScript'i bash betiğinden çalıştır


55

Bir AppleScript'i bir bash betiğinin içinden çalıştırmak istersem, yürütmem gereken komutların listesini içeren bir dosyayı çağırabilirim.

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

Ancak, bash içinden sırayla çalıştırılması gereken komutları çalıştırmak istersem ne yapmalıyım?

Bir örnek olurdu

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

Bunun çok uzak bir örnek olduğunu biliyorum, ama ne yapmaya çalıştığımı açıklamaya çalışıyor. Normalde, bu komutların \tümü, her yerdeki ilgili kaçış karakterleri olmadan ve "her komutun etrafında daha az yazılır . Onları bir .scptdosyanın içinde de tutardım.

Farkında olduğum bir çözüm, betiği #!/usr/bin/osascriptbash yerine kullanarak yeniden yazmak ve oradan gitmek, fakat karıştırmak istiyorum. Bir komut dosyası için test edebileceğimi öğrendim, eğer bir tane oluşturmak ve bir komutu eklemek için mevcutsa bu dosyaya ihtiyacım var ve ardından gerekli komut dosyasını bash içinden yürütmek, ancak bu da amacı bozuyor.

Bir dosyanın ortasından geçmem mümkün değil, shebanghat ile kullanılan kabuğu değiştirip sonra gerekli komutları yerine getirdikten sonra geri çekebilirim , değil mi?

Herhangi bir içgörü hoş karşılanmadan daha fazlası olurdu.

Yanıtlar:


57

Argümanı osascript -eyeni satırlar içerebilir:

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

Birden fazla -eargüman da belirleyebilirsiniz :

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

Eğer bir yorumlu metin kullanmak Veya, bash(üç karakteri olarak yorumlar \, $ve `) arasında <<ENDve ENDaralarında ama hiçbir karakter <<'END've END.

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

Düzenle:

Osscript heredoc ile çalışabildiğinden (/ / dev / stdin'den girdi alın), o zaman bir komut dosyasını bütün bir dosya olarak yazabilir ve doğru shebang satırını kullanarak hazırlayabilirsiniz:

#!/usr/bin/env osascript

set x to "a"
say x

Bu aynı zamanda aşağıdaki komutları kullanarak elma betiğinizi ~ / Applications / .app dizininde gerçek bir program olarak kaydetmenize izin verir (betiğinizin ismini değiştirerek):

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>

Her iki komut dosyasının da ... / MacOS / içinde ve eşleşmelerde olduğundan emin olun


Gerçekten de haklısın. end tellSenaryonun ilkini özledim .
Danijel-James W

-eHEREDOC örneğinde ihtiyacınız yok mu?
iconoclast

@iconoclast osascript sayfasındaki man sayfa başına bir komut dosyası satırıdır. -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

Maalesef @uchuugaka, ancak cevabınızın sorumu nasıl yanıtladığını anlayamıyorum. İçinde -e statement Enter one line of a scriptvar olan bir -emevcut. Fakat bunun dışında, bir HEREDOC tek bir hat gibi gözüküyor mu?
iconoclast

21

Ham AppleScript'i kendi içine sarabilirsiniz <<EOD... EODGirişin son işaretinin satırdaki ilk pozisyona gelmesi gerekir.

(BTW, el kitabınız bir end tellsüre sonra kayboluyor gibiydi 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"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.