从bash脚本运行AppleScript


55

如果我想从bash脚本中运行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"

我知道这是一个非常牵强的示例,但是它可以解释我正在尝试做的事情。通常,这些命令都将\在各处而不是"每个命令周围都写有各自的转义字符的情况下被写入。我也将它们放在.scpt文件中。

我知道的一种解决方案是使用#!/usr/bin/osascript而不是bash 重写脚本,然后从那里开始,但是我希望能够融合。我发现我可以测试一个脚本文件,如果确实存在,可以创建一个脚本文件并将我需要的每个命令附加到该文件,然后从bash中执行所需的脚本文件,但这也无法达到目的。

没有办法在文件中途进行交换,我可以将正在使用的shell与该shebang行交换,然后在执行必要的命令后交换回去,是吗?

任何见识都将受到欢迎。

Answers:


57

的参数osascript -e可以包含换行符:

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

您还可以指定多个-e参数:

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

或者,如果您使用的是定界符,bash解释(三个大字\$`)之间<<ENDEND,但之间没有字符<<'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

这还允许您使用以下过程(更改脚本名称)将Apple脚本另存为〜/ 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

有什么理由不需要-eHEREDOC示例吗?
iconoclast

@iconoclast在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包装在<<EOD...中。最后一个EOD信号表示输入结束必须位于该行的第一个位置。

(顺便说一句,你的AppleScript似乎缺少一个end tellactivate....)

#!/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"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.