FileMakerからターミナルコマンドを送り込む二つの方法

FileMakerからAppleScriptを使ってターミナルコマンドを送り込む二つの方法についておさらいです。スキル0でもかんたんに実現。

AppleScript を使ってターミナルコマンドを送り込むこと

FileMakerからAppleScriptを実行させてターミナルにコマンドを送り込むことを行います。過去すでに書いたことと内容被りますが気にしません。

二つの方法があって、どちらにせよスクリプトステップ「AppleScriptを実行」を使います。その AppleScript のスクリプトの違いです。

do script with command “コマンド”

AppleScriptを使ってターミナルにコマンドを送り込みたいとき、do script with command “コマンド” を使うという方法があります。

送り込むコマンドが極めて単純なものである場合、有効です。単純じゃないコマンドの場合、作成者がAppleScriptやターミナルに精通しているエキスパートである場合に限り有効です。

例えば「SSH digitalboo」みたいなかんたんコマンドなら「do script with command “SSH digitalboo”」と書くだけなので凡人以下のdigitalboo筆者にも楽勝です。楽勝というのは、この一文をFileMakerの計算式やスクリプトを使って自動生成させることも含めて楽勝って意味です。

tell application "Terminal"
  activate
    do script with command "SSH dititalboo"
end tell

スクリプトステップ「AppleScriptを実行」でこれを実行させればいいだけです。

送り込みたいコマンドが複雑なとき、たとえばコマンドの中にパスが含まれていて、そのパスの中に「Macintosh HD」「Moble Documents」のようなスペースが含まれている場合などは一気に悪夢と化します。エラーで実行できないんです。

例としてこんなFileMakerのコマンド生成計算式があります。

"exiftool -s " & posix(Images::ファイルパス) & " | pbcopy"

コマンド(exiftool)に続いてパスの記述を必要とします。パス生成をFileMakerが担当( posix(Images::ファイルパス) )していまして、出来上がったコマンドは以下です。

exiftool -s /Users/ユーザー名/Library/Mobile\ Documents/com~apple~CloudDocs/images/Lucky\ 001.jpg | pbcopy

パスの中にスペースを含みますから「 \ 」でエスケープしています。

do script with command “” に、このコマンドを挿入してAppleScriptを生成すると次のようになります。

tell application "Terminal"
activate
do script with command "exiftool -s /Users/ユーザー名/Library/Mobile\ Documents/com~apple~CloudDocs/images/Lucky\ 001.jpg | pbcopy"
end tell

できました。こういうのを計算で作らせるとFileMakerの威力を感じますね。しかしこれを「AppleScript実行」しても実はエラーで動きません。

エラー画面1
最初のエラー

エスケープの処理についての無知が原因だと推測されますが、駄目なものは駄目なだけです。

さらにエラー
さらにエラー

謎なことに、中身のコマンドを手動でターミナルにペーストすればエラーなく動くんです。

問題の特定のためにScriptエディタで試してみるとエラーになりました。FileMaker関係なしに、コピペで問題ないコマンドを「do script」の中に書くとエラーになるということが判ります。

同じコマンドなのにターミナルにコピペしたら正常に動き、AppleScript の do script で使えばエラーでアウト。これはいったいどういうこと?

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

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

コピペで送る

do script with command などというコマンドを知らない頃から、AppleScriptを使ってターミナルにコマンドを送りこむことをすでにやっていました。

AppleScript でキーボードショートカットを送り込めますから、ターミナルウインドウにコピー済みのコマンドをペーストするという、普段人としてやってることと同じ事をスクリプトで自動化していただけです。

FileMakerでターミナルのコマンドを生成したらスクリプトステップで

1. まずそれをコピーし、
2. 次にターミナルに切り替えて念のために新規ウインドウを開いて、
3. ペーストする

AppleScriptを実行ダイアログ
ターミナルで新規ウインドウしてリターン込みでペースト。この後、用が済めばウインドウを閉じる( key code 13 using {command down}  )までやっとくことを推奨

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

コピペを再現しただけの野蛮なやり方です。難なくターミナルにコマンドを送り込めます。これで動くし、満足していました。

妙に知恵が付いて「do script with command」なんてものを知ったが為に「これを使ったほうが賢そうに見えるかも」と思ったのが運の尽き。身分不相応の浅知恵では何も上手く行かずやさぐれるだけだと学びました。

教訓

FileMakerでAppleScriptを使ってターミナルにコマンドを送り込むとき、そのコマンドが極めて単純なら「do script with command」が有効、そうでない場合はコピペが有効。

 

Penguin icon  その後時が流れ・・・

この件の続きというか、do script についての知見が広がりました。

AppleScriptから実行させるコマンドのパスにスペースがあるとエラーになる問題を解決

 


Penguin icon

ということで「Macで実行もできるFileMakerコード管理その2」の中で軽く書いたことを書き直しただけのポストでした。今回、例に挙げたコマンド、

exiftool -s path | pbcopy

このコマンドにも関するFMメディア管理の話を書こうとしていたんですが散漫かつ長文になりそうですので、このように小出しにしています。

★ ちょっと関係する投稿

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

クリップボードにコピー

ExifToolのかんたんなメモ