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

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

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

三つの方法は、コピペDo Script、そして Do Shell Script です。同じ話題を当ブログ内であちらこちらに何度も書いていまして、それらをここにまとめました。

スキル別

スキル別というのには理由があって、それは素人の雑魚であった Digitalboo 筆者が辿った知恵の履歴に沿うということです。三つの方法ですが少し細分化するとこうなりました。

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

では行きます。

L1 ターミナルにコピペ

ショートカットでターミナルウインドウにペーストするだけです。

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

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

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

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

実行させたいコードを何らかの手段を使ってコピーした後はAppleScript で次のように書きます。ターミナルウインドウをアクティブにして、新規ウインドウにペースト。

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

なんのことはない。ターミナルをアクティブにしてコマンド+N、コマンド+Vを行ってるだけです。( key code 45Nkey code 9V )

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

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

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

AppleScirpt では難しいことをしなくてもショートカットを実行するだけでかなりいろいろな操作が実現できます。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 〜

と書かねばなりません。

最初の頃は何一つ意味が判らず、右往左往しました。

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

pbcopy

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

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

と書かねばなりません。

pbcopy についての投稿で奮闘ぶりを報告しています。

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

pbcopy 以外にも、ターミナルとそうでない場合に挙動や書き方が変わってしまうコマンドがあるかもしれません。

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

 

Automator シェルの do 〜 done

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

Automator のシェルもその一つかもしれません。

図7 動いた

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

 

 

その後の展開

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

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

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトは reCAPTCHA と Google によって保護されていますプライバシーポリシー利用規約 申し込み。

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