今回はターミナルからmacOSのアプリケーションを制御します。あらかじめ用意されているopenコマンドなどでもアプリケーションの起動などはできます。
ただ、より細かい制御を行う場合、macOSではAppleScriptが必要になります。GUIでは自動化が難しい時代もありました(Quickeysなどもありました)。そんな中、1993年当時最新版であったSystem 7(その前は日本だとSystem 6+漢字Talk) にAppleScriptは搭載されました。

AppleScriptは独特の文法なので分かりにくい部分もありますが、AIの力を借りることで詳しくなくてもAppleScriptで制御/自動化できる時代になりました。
完全に自動制御させる場合、AppleScriptがどうしても必要になることがあります。とにかくAppleScriptは、いろいろ処理できるので、今回は簡単な処理だけ行ってみることにします。定型的な処理であれば他にも標準で用意されているオートメーターを使う方法もあります。オートメーターも土台はAppleScriptなので、どのみちAppleScriptを知っていれば、いろいろできるということになります。

今回もこれまでと同様にデスクトップ上にあるsampleディレクトリに必要なファイルを用意しておきます。

○man osascript

 macOSのターミナルからAppleScriptを利用するにはosascriptコマンドを使います。
 まずはman osascriptとしてコマンドの内容を確認しておきましょう。

○TextEdit.app(テキストエディタ)を制御する

 それではmacOSに標準で入っているTextEdit.app(テキストエディタ)を制御してみましょう。

まず、TextEdit.appをアクティブにしてみます。起動していない場合はTextEdit.appが起動します。ここではTextEdit.appは起動していない状態にしてあります。TextEdit.app起動時にダイアログが表示されるようになっています。

osascript -e 'tell application "TextEdit" to activate'

無事に制御できたのを確認したら、今度はTextEdit.appで新規にドキュメント作成してみましょう。ターミナルから以下のように入力します。実行するとmacOSのバージョンによってはセキュリティ関係の確認ダイアログが表示されます。OKを押してAppleScriptの制御を許可してください。

osascript -e 'tell application "TextEdit" to activate' -e 'tell application "TextEdit" to make new document'

するとTextEdit.appで新規にドキュメントが作成されます。そして、ターミナルには作成されたドキュメントの名前(AppleScriptプログラムからの戻り値)が表示されます。

それでは次にTextEdit.appで新規にドキュメントを作成して、そこに文字を表示(自動入力)してみましょう。ここでは、この連載のタイトルである「なんとなくコマンド」の文字を表示してみます。

これは以下のようなコマンドになります。長いのですが、とりあえずこの段階はこのようにすれば処理されます。なお、PowerPC搭載のMacOSでは処理が遅いことがあるので、うまくいかない場合は以下のdelay 1の1の値を大きくしてみてください。さすがに、そんな古いMacintoshは動いていないと思われる人がいるかもしれません。が、自分が作ったのがいまだに某所で自動処理のために動いていたりします。特にDTP関係だと古いマシン/環境のままというところもあります。

osascript -e 'tell application "TextEdit" to make new document' -e 'delay 1' -e 'tell application "TextEdit" to set the text of the front document to "なんとなくコマンド"'

無事に新規ウィンドウが作成され「なんとなくコマンド」の文字が入っていればバッチリです。
○AppleScriptをファイルにしておき実行する

 先ほどまでは非常に長いAppleScriptのプログラムでした。ターミナルから実行する都合というのもありますが、さすがに読みにくいですしプログラムの修正も大変です。そこで、今度はAppleScriptのプログラムをファイルに保存しておき、そのファイルのプログラムを実行するようにします。
 先ほどのAppleScriptをフラットに(普通に)書くと以下のようになります。

tell application "TextEdit"
activate
make new document
delay 1
set the text of the front document to "なんとなくコマンド"
end tell

これをデスクトップ上にあるsampleディレクトリ(フォルダ)に保存します。


保存したらターミナルで以下のようにコマンドを入力します。すると、先ほどと同様にTextEdit.appで新規にドキュメントが作成され、そこに文字が入力されます。

osascript sample1.scpt

次にこの新規に作成したドキュメントをデスクトップ上にあるsampleディレクトリ(フォルダ)にtest1.txtという名前で保存してみます。
以下のAppleScriptをsample2.scptというファイル名で保存します。

tell application "TextEdit"
activate
make new document
delay 1
set the text of the front document to "なんとなくコマンド"
tell front document
save in POSIX file "/Users/weed/Desktop/sample/test1.txt"
end tell
end tell

ファイルの保存場所は以下の行で指定しています。注意点としては完全パス(フルパス)で指定しないと期待通りに動作しないということです。他の記述方法もありますが、完全パスで指定するなら以下の指定方法が一番分かりやすいでしょう。なお、保存先のディレクトリ(フォルダ)は存在していないと正しく処理されません。

save in POSIX file "/Users/weed/Desktop/sample/test1.txt"

sample2.scptとして保存したAppleScriptを実行するには以下のようにコマンドを入力します。

osascript sample2.scpt

無事に実行されるとsampleディレクトリ内にtest1.txtファイルとして保存されます。なお、ドキュメントウィンドウは閉じていないので、そのままになります。
ウィンドウを閉じてしまいたい場合はcloseを追加します。
以下のAppleScriptになります。これをsample3.scptとして保存しておきます。

tell application "TextEdit"
activate
make new document
delay 1
set the text of the front document to "なんとなくコマンド"
tell front document
save in POSIX file "/Users/weed/Desktop/sample/test1.txt"
close
end tell
end tell

保存したら以下のようにコマンドを入力します。

osascript sample3.scpt

test1.txtを開いて内容を確認します。

○標準出力をTextEdit.appに渡す

 それでは次にUNIXの標準出力の結果をTextEdit.appに渡してみます。標準出力を渡すことができれば応用範囲が広がります。注意点としてはAppleScriptは大きなデータサイズのものは受け取れません。場合によっては分割するなり何か方法を考えないと駄目なこともあります。
 まず、標準出力の前にosascriptコマンドに渡されたパラメーターを処理してみます。
 以下のAppleScriptをsample4.scptというファイル名で保存します。

on run argv
set shellOutput to item 1 of argv
tell application "TextEdit"
activate
make new document
set the text of the front document to shellOutput
end tell
end run

ターミナルで以下のコマンドを入力するとTextEdit.appで新規ドキュメントが作成され123456の数値が入力されます。

osascript sample4.scpt 123456

パラメーターが受け取れるなら標準出力を、そのままパラメーターとして渡しても良さそうですが、実行すると以下のようにエラーになります。


echo 987 | osascript sample4.scpt

そこで次に渡されたパラメーターをコマンドとして実行し、その結果をドキュメントに入力するように変更します。
以下のようにAppleScriptを変更しsample5.scptというファイル名で保存します。

on run argv
set shellOutput to do shell script item 1 of argv
tell application "TextEdit"
activate
make new document
set the text of the front document to shellOutput
end tell
end run

変更箇所は以下の行です。do shell scriptは後に続くUNIXコマンドを実行します。item 1 of argvなので最初に渡されたパラメーターをコマンドとみなして実行し、その結果をshellOutputに入れることになります。

set shellOutput to do shell script item 1 of argv

それでは早速実行してみましょう。以下のようにechoコマンドと、そのパラメーターを指定します。実行するとドキュメントに「なんともなコマンド」の文字が入力されます。

osascript sample5.scpt "echo 'なんともなコマンド'"

lsコマンドの結果を流し込むこともできます。

osascript sample5.scpt 'ls -la'

.
編集部おすすめ