เรียกใช้ AppleScript จากสคริปต์ทุบตี


55

หากฉันต้องการเรียกใช้ AppleScript จากภายในสคริปต์ทุบตีฉันสามารถเรียกไฟล์ที่มีรายการคำสั่งที่ฉันต้องการเรียกใช้งาน

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

อย่างไรก็ตามถ้าฉันต้องการรันคำสั่งที่จำเป็นต้องรันตามลำดับจากภายใน bash

ตัวอย่างจะเป็น

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

ฉันรู้ว่านี่เป็นตัวอย่างที่ดึงมาได้ไกลมาก แต่ก็ใช้งานได้เพื่ออธิบายสิ่งที่ฉันพยายามทำ โดยปกติแล้วคำสั่งเหล่านั้นทั้งหมดจะถูกเขียนโดยไม่มี\อักขระescape ตามลำดับทั้งหมดและน้อยกว่า"แต่ละคำสั่ง ฉันต้องการให้พวกเขาอยู่ใน.scptไฟล์

วิธีแก้ปัญหาที่ฉันทราบคือการเขียนสคริปต์ใหม่โดยใช้#!/usr/bin/osascriptแทนการทุบตีและไปจากที่นั่น แต่ฉันต้องการที่จะผสมผสาน ฉันพบว่าฉันสามารถทดสอบไฟล์สคริปต์ได้หากมันมีอยู่เพื่อสร้างและผนวกแต่ละคำสั่งที่ฉันต้องใช้กับไฟล์นั้นจากนั้นเรียกใช้ไฟล์สคริปต์ที่ต้องการจากภายในทุบตี แต่ยังเอาชนะวัตถุประสงค์

ไม่มีทางที่มิดเวย์ผ่านไฟล์ฉันสามารถสลับเชลล์ที่ใช้กับshebangบรรทัดแล้วสลับกลับไปหลังจากที่ฉันเรียกใช้คำสั่งที่จำเป็นแล้วมีหรือไม่?

ความเข้าใจใด ๆ จะเป็นมากกว่าการต้อนรับ

คำตอบ:


57

อาร์กิวเมนต์สำหรับosascript -eสามารถมีการขึ้นบรรทัดใหม่:

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

คุณยังสามารถระบุ-eอาร์กิวเมนต์ได้หลายอย่าง:

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

หรือถ้าคุณใช้ heredoc การbashตีความตัวละครทั้งสาม ( \, $และ`) ระหว่าง<<ENDและENDแต่ตัวละครระหว่างไม่มีและ<<'END'END

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

แก้ไข:

เนื่องจาก osascript สามารถทำงานกับ heredoc (เช่นรับอินพุตจาก / dev / stdin) ดังนั้นหนึ่งสามารถเขียนสคริปต์เป็นไฟล์ทั้งหมดและเสริมด้วยเส้น Shebang ที่ถูกต้อง:

#!/usr/bin/env osascript

set x to "a"
say x

สิ่งนี้ยังช่วยให้คุณสามารถบันทึกแอปเปิ้ลสคริปต์ของคุณเป็นโปรแกรมจริงใน ~ / Applications / .app โดยใช้ขั้นตอนต่อไปนี้ (เปลี่ยนชื่อสคริปต์ของคุณ):

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>

ตรวจสอบให้แน่ใจว่าทั้งไฟล์สคริปต์ใน ... / MacOS / และรายการที่ตรงกัน


แน่นอนคุณถูกต้อง ฉันพลาดบทแรกend tellไป
Danijel-James W

เหตุผลใดที่คุณไม่ต้องการ-eตัวอย่าง HEREDOC
iconoclast

@iconoclast ต่อหน้า man บน osascript เป็นหนึ่งบรรทัดของสคริปต์ -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

ขออภัย @uchuugaka แต่ฉันไม่เข้าใจว่าคำตอบของคุณตอบคำถามของฉันอย่างไร ใน-e statement Enter one line of a scriptมีเป็น-eปัจจุบัน แต่นอกเหนือจากนั้น HEREDOC ได้รับการปฏิบัติเหมือนเป็นบรรทัดเดียวหรือไม่?
iconoclast

21

คุณสามารถหุ้ม AppleScript แบบ raw ใน<<EOD... EODสัญญาณสุดท้ายที่จุดสิ้นสุดของอินพุตต้องมาที่ตำแหน่งแรกในบรรทัด

(BTW, applescript ของคุณดูเหมือนจะหายไปend tellหลังจาก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"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.