Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

前提知識

  • 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に渡していたので実行属性いらなかった)、うまく走るようになった。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away