LoginSignup
26
25

More than 5 years have passed since last update.

MacでGUI操作するシェルスクリプトを書こうとしてハマったこと

Last updated at Posted at 2014-10-25

前提知識

  • MacではOSX 10.1.2からOpen Scripting Architecture準拠のAppleScriptの実行をサポートしている
    • OSX 10.10 YosemiteからJavaScriptもサポートされた
  • /usr/bin/osascriptにAppleScriptを渡すとGUIの操作(GUIスクリプティング)をシェルスクリプトから行うことができる
    • ただし、10.8までは システム環境設定 >> アクセシビリティ >>「補助装置にアクセスできるようにする」 をオンにする必要がある
    • 10.9からはセキュリティ管理の仕組みがかわり、 システム環境設定 >> セキュリティとプライバシー >> プライバシー >> アクセシビリティ で、GUIスクリプティングを実行するアプリケーションごとにアクセシビリティを有効にする必要がある

ハマったこと

Yosemiteをクリーンインストールしたあとに走らせると、xcode-select --installを実行してそのウィザードのクリックも自動でやってくれるrebuildというgemを作った。
めちゃくちゃハマって何時間も無駄にしたので、私がハマった点を共有したい。

そもそも何かけばいいのかわからない

Automator.appでワークフローを作成し、「AppleScriptを実行」を追加して、そこに「記録」で作ったフローをドラッグアンドドロップすると任意の操作を再現するAppleScriptが作られる。
なお、Script Editor.appの記録機能ではFinderの操作くらいしか記録してくれない。

*.scpt is not allowed assistive access. というエラーが出る

これはAppleScriptを実行するアプリケーションがアクセシビリティを有効にされてないと出る。
アクセシビリティを管理するデータは/Library/Application Support/com.apple.TCC/TCC.dbというsqliteのDBのaccessというテーブルに入っている。

スキーマは、

0|service|TEXT|1||1
1|client|TEXT|1||2
2|client_type|INTEGER|1||0
3|allowed|INTEGER|1||0
4|prompt_count|INTEGER|1||0
5|csreq|BLOB|0||0

となっていて、例えばTerminal.appからAppleScriptを走らせたい場合は service="kTCCServiceAccessibility", client="com.apple.Terminal", client_type=0, allowed=1にする必要がある。
つまり、以下のようなコマンドをAppleScriptの実行前に仕込めば良い。

sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db \
  "INSERT OR REPLACE INTO access VALUES('kTCCServiceAccessibility','com.apple.Terminal',0,1,0,NULL);"

なお、clientにいれるアプリケーションのbundle identifierはcodesign -dv ***.appとやれば見れる。

An error of type -10810 has occurred. というエラーが出る

これは場合による。
私が遭遇したケースでは、*.scptにshebangつけてchmod +xしていたせいで動かなくなっていて、chmod -xで実行可能属性を外したら(明示的にosascriptに渡していたので実行属性いらなかった)、うまく走るようになった。

26
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
25