Chạy AppleScript từ tập lệnh bash


55

Nếu tôi muốn chạy AppleScript từ trong tập lệnh bash, tôi có thể gọi một tệp có danh sách các lệnh mà tôi yêu cầu thực thi.

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

Tuy nhiên, điều gì nếu tôi muốn chạy các lệnh cần được chạy theo trình tự từ bên trong bash?

Một ví dụ sẽ là

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

Tôi biết đây là một ví dụ rất xa, nhưng nó hoạt động để giải thích những gì tôi đang cố gắng làm. Thông thường, tất cả các lệnh đó sẽ được viết mà không có các \ký tự thoát tương ứng của chúng ở khắp mọi nơi và ít hơn "xung quanh mỗi lệnh. Tôi cũng có chúng trong .scpttập tin.

Một giải pháp tôi biết, là viết lại kịch bản bằng cách sử dụng #!/usr/bin/osascriptthay vì bash và đi từ đó, nhưng tôi muốn có thể trộn. Tôi đã thấy rằng tôi có thể kiểm tra tệp tập lệnh, nếu nó tồn tại để tạo một tập tin và nối từng lệnh tôi cần vào tập tin đó và sau đó thực thi tập tin tập lệnh cần thiết từ bên trong bash, nhưng điều đó cũng đánh bại mục đích.

Không có cách nào giữa chừng một tập tin, tôi có thể trao đổi shell đang được sử dụng với shebangdòng và sau đó trao đổi lại sau khi tôi đã thực hiện các lệnh cần thiết, có phải không?

Bất kỳ cái nhìn sâu sắc sẽ được chào đón nhiều hơn.

Câu trả lời:


57

Đối số cho osascript -ecó thể chứa dòng mới:

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

Bạn cũng có thể chỉ định nhiều -eđối số:

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

Hoặc nếu bạn sử dụng một heredoc, bashgiải thích ba nhân vật ( \, $`) giữa <<ENDENDnhưng không có ký tự giữa <<'END'END.

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

Biên tập:

Vì osascript có thể hoạt động với một heredoc (tức là lấy đầu vào từ / dev / stdin), nên người ta chỉ có thể viết tập lệnh dưới dạng toàn bộ tệp và thêm vào dòng shebang chính xác:

#!/usr/bin/env osascript

set x to "a"
say x

Điều này cũng cho phép bạn lưu tập lệnh apple của bạn dưới dạng một chương trình thực tế trong ~ / Ứng dụng / .app bằng cách sử dụng quy trình sau (thay đổi tên tập lệnh của bạn):

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>

Đảm bảo rằng cả tệp tập lệnh trong ... / MacOS / và các kết quả khớp


Quả thực bạn đúng. Tôi đã bỏ lỡ phần đầu tiên end tellcủa kịch bản.
Danijel-James W

Bất kỳ lý do nào bạn không cần -eví dụ về HEREDOC?
iconoclast

@iconoclast Mỗi trang man trên osascript, nó là một dòng script. -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

Xin lỗi @uchuugaka, nhưng tôi không hiểu câu trả lời của bạn trả lời câu hỏi của tôi như thế nào. Trong -e statement Enter one line of a scriptđó một -emặt. Nhưng ngoài ra, một HEREDOC được đối xử như thể nó là một dòng duy nhất?
iconoclast

21

Bạn có thể bọc AppleScript thô trong <<EOD... Dấu EODhiệu cuối cùng báo hiệu kết thúc đầu vào phải đến ở vị trí đầu tiên trong dòng.

(BTW, applescript của bạn dường như bị thiếu end tellsau 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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.