FileMakerからAppleScriptでコマンドを送り込む三つの方法 スキル別まとめ

FileMaker から AppleScript を使ってターミナルのコマンドライン命令文を実行させる三つの方法についておさらいします。コピペ、do script、do shell script です。スキル別にまとめました。

前置き

三つの方法とは、コピペ、Do Script、そして Do Shell Script です。

同じ話題を当ブログ内であちらこちらに何度も書いていまして、それらをまとめようと本稿をすべて書き直しました。

FileMaker からコマンドを実行すること

ターミナルで使うコマンドを FileMaker から実行する方法は「AppleScript を実行」スクリプトを使うことで、つまり FileMaker 意味ありません。でも意味あります。FileMaker 内でちょっとした工夫をするだけで、コマンドの生成やパスの転記など面倒な工程がちょー簡素化できるからです。ですので個人的に AppleScript を実行するのは常に FileMaker 前提なんですね。はい。ただの個人的な事情ですが。

この話は CodeManager のところでたっぷりやってます。
Macで実行可能なFileMakerコード管理 CodeManager

スキル別

スキル別というのには理由があって、それは Digitalboo 筆者が辿った履歴に沿うということです。紛う事なきスキル0マンで素人以下の雑魚であった最初の頃にやっていたこと、やや浅知恵が付いてつんつんしていた頃にやっていたこと、そして成長し謙譲の徳も手に入れた素人アバタールとしての現在です。成長しましたが雑魚であることには変わりませんので、実は現時点でまだよくわかっていないことだらけでもあります。

三つの方法ですが少し細分化するとこうなりました。

  • LEVEL 1 ターミナルにコピペ
  • LEVEL 2 ターミナルに do script 簡易コマンド
  • LEVEL 3 ターミナルに do script スキルアップ版
  • LEVEL 4 直接 do shell script

では行きます。

L1 ターミナルにコピペ

「ターミナルにこういうコマンドをタイプすればいいよ」と、便利なコマンドを賢人たちがブログに書いておられまして、それをコピーし、ターミナルウインドウにペーストしてリターン、そういうことをやっていました。TimeMachine の速度を調整したり、全てのアプリケーションを許可したり、いろいろ便利なコマンドがあります。

「これは有能。メモしておこう」と、知ったコマンドをメモしたりしていました。

ということで、原初から、人はコピペで実行します。コンピュータの黎明期に革命を起こした三賢者こそ、コピーペーストアンドゥの三者です。

自動化の最初は、AppleScript を使ってキーボードショートカットを実行することです。理屈はコピペです。実行することはコピペです。

まず最初に実行させたいコードを選択してコピー、その後AppleScript でターミナルウインドウをアクティブにし、ペーストします。

FileMaker「AppleScript を実行」ダイアログ
FileMaker「AppleScript を実行」ダイアログ

key code 45Nkey code 9Vです。ターミナルに移動してコマンドN、コマンドVを行ってるだけという。

Wは13ですので、リターン(36または52あるいはその他)のあと、用が済めばウインドウを閉じる( key code 13 using {command down} )までやっとくといいかもですね。

ちょっと難点があるとすれば、キーの番号ですね、これを知る必要があります。文字キーの部分はほぼどんな機種でも共通、リターンの例のように、装飾キーはキーボードによって異なる場合があります。

→ Macのキーコードを調べるアプリ

AppleScript でショートカットを実行するだけで、かなりいろいろな操作が実現できます。Finder のファイル操作とか。何でも。長い間、ショートカットのみで自動化を作りまくっていました。

そして満足していました。

L2 ターミナルに do script 簡易なコマンド

do script は AppleScript からコマンドを呼び出す命令です。

do script “ここにコマンド” と書きます。ターミナルに送り込みますから、AppleScript ではこういう感じです。

tell application "Terminal"
  activate
    do script with command "ここにコマンド"
end tell

ターミナルをアクティブにし、コマンドを送り込みます。やってることはコピペと変わらないのですが、クリップボードを使わなくていいという微かな利点があります。

送り込むコマンドが極めて単純なものである場合、有効です。単純じゃないコマンドの場合、作成者に多少スキルが求められます。

単純なコマンドとは、そのコマンドだけ送り込めばOKみたいなやつです。”ssh digitalboo” とか “defaults write NSGlobalDomain NSAppSleepDisabled -bool YES” とかです。

複雑なコマンドとは、たとえばパスが必要で、そのパスの中にスペースが含まれているような場合、また、引数・パラメータなどが付け加えられている場合などです。難しいことになります。

理解力のないまま、適当に書いてもエラーではじかれます。エラー画面1

最初、素人以下の雑魚である Digitalboo 筆者には手も足も出ませんでした。意味わからんし。

さらにエラー

いろいろ試したり調べたり無駄なあがきをし続け、だんだん腹が立ってきてやさぐれ始めます。答えは多分こういうことだと思いました。

do script は素人が軽く考えるような安直なものではない。手を出すんじゃねえ。

そんなふうに考え、簡単なコードなら do script そうでなければコピペ。と、自動化を使い分けていました。

そして、それに満足していました。

L3 ターミナルに do script スキルアップ版

やがて素人以下の雑魚であった筆者にも僅かに浅知恵がつき始め、do script に書くべき書式のことが少し判り始めます。

最初は、パスにスペースが入っているだけでお手上げでしたし、お手本にないのに勝手にクォーテーションで括ってはいけないと思い込んいました。

やがて Apple のお手本などを元にものを考えるということをし始め、やっとのことでコマンドをどのように変換すれば do script で有効になるかがわかり始めました。以下のポストにはそのあたりの経緯がだらだら書かれていますが、ここを見ている人は特に読む必要ありません。このすぐ後にまとめるからです。

AppleScriptからdo script で呼び出すコマンドのパスにスペースがあるとエラーになる問題を解決

 

コードを「 do script “ここにコード” 」に填め込むための整形

  • コード全体を ” “ の中に入れるから、コードの中に ” ” があってはならない。もしあれば ‘ ‘ に変更する。
  • パスがあれば、’ ‘ で括る。括るからエスケープ必要なし。
  • パス以外でも、パラメータの値的な部分を ‘ ‘ で括ってもよい。
  • > やら | やら * やら、記号があっても気にしなくてよい。何も変更しない。
  • 複数行のコマンドが書かれていれば、それは複数の命令だから改行を  ;  に置き換える。

do script ” ” に填め込もうとするコマンドが多少複雑でも、概ねこれで上手くいってます。
ただし、かなり複雑なやつはよくわからないので想定外としています💦

L4 素で do shell script

Penguin icon  do script をマスターしたあなたや私は、 do shell script にチャレンジすることになります。

do scirpt では、ターミナルをtellしてコマンドを送り込みました。

tell application "Terminal"
   activate
     do script with command "コマンド"
 end tell

do shell script ではターミナルを介さず直接命令します。

do shell script "コマンド"

直接何に命令するんでしょう。さあ。b…

それはともかく、do script の ” ” にコードをはめ込む変換ができるレベルの才能があれば、わざわざターミナル画面をアクティブにして画面上でちらちらさせたくないな。と、ターミナルを使わずに命令を実行させたくなりますね。

ただし、親切で優しくて融通を利かせてくれるターミナルをすっ飛ばすことで、細かな問題も頻出します。

ターミナルをすっ飛ばす弊害の例

外部ツール

例えば、ExifTool など外部ツールをインストールしたとしましょう。ターミナルでは「exiftool 〜」と命令を書き始められますが、ターミナルをすっ飛ばす場合はそれでは動きません。

/usr/local/bin/exiftool 〜

と書かねばなりません。

pbcopy

お気に入りの pbcopy というコマンドがあります。ターミナルでは、命令文の最後に | pbcopy と書けば結果をクリップボードに収めてくれますが、ターミナルをすっ飛ばすと結果は消えてなくなります。

コマンド | LANG=en_US.UTF-8 pbcopy

と書かねばなりません。

このような数々の試練に対処していくことができれば、速度やインターフェイスデザイン的に有利でスマートなこの方法を実践できるでしょう。

Automator シェルの do 〜 done

ターミナルを介さずコマンドを ” ” に収めた書式で書けるということは、コマンドの中にコマンドを書くことができたということでもあります。つまり最早 AppleScript も関係ない世界が開けています。

Automator のシェルもその一つです。

図7 動いた

Automator シェルの do 〜 done に書くコード、これって do shell script と同じことなんじゃないのかなと。違う? 知らんけど。

このポストは大幅に書き換えました

ということで本ポストは以上ですが、このページは最初の投稿から全面的に書き換えております。当初は、do script というものを知ったけど上手く動かず、簡易なコマンドのみに留めてそれ以外はコピペで運用する、ここでいうところの L2 に相当する状態の頃に書いたものです。

時系列的におかしなことになるくらい、当初書いていたことから逸脱し、うんと後になって書き直し、総括する内容となりました。

 

【参考ポスト】

参考にしなくていいけど、以下のポストのまとめ的なものが本稿です。

自動化してみたいなとぼんやり考えた最初の発端

ターミナルで動くのにAutomatorのシェルではエラー

ターミナルを介さない do shell script の難易度は覚悟すべき高い山。その一端が垣間見れる pbcopy に関するポスト

do shell script で pbcopy が動かない事例を解決

そしてそもそもの発端は「自動化したい」というところにありました。自動化するために FileMaker が最適とわかり、CodeRun へと発展しました。

Macで実行可能なFileMakerコード管理 CodeManager v2

 

 

 

コメント

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください