mattintosh note

どこかのエンジニアモドキの備忘録

Automator で tclsh を使う

glob が激っ速だったので最近 Tcl を使って遊んでたりする。「Automator でも Tcl に乗り換えようかな」と思ったけど残念ながら『シェルスクリプトを実行』アクションには /usr/bin/tclsh の選択肢が無い。

そこで、Run Shell Script.action の中にある Shells.plist を書き換えて tclsh を使えるようにする。tclsh に限らず自分でインストールした新しいバージョンの zshpythonruby、あるいは php も追加できる。


現在の環境は Mavericks だけど実際には Snow LeopardAutomator から引っ張ってきた Run Shell Script.action を使っているのでちょっと異なる部分があるかもしれない。


Automator はシステムライブラリにあるものよりユーザライブラリにある方を優先してくれるので複製を作ってそちらを変更していく。

# ユーザライブラリにディレクトリを作成
mkdir -p ~/Library/Automator

# システムライブラリのアクションをコピー
cp -R /System/Library/Automator/Run\ Shell\ Script.action ~/Library/Automator

# プロパティリストのバックアップ
cp ~/Library/Automator/Run\ Shell\ Script.action/Contents/Resources/Shells.plist \
   ~/Library/Automator/Run\ Shell\ Script.action/Contents/Resources/Shells.plist.default

続いて Run Shell Script.action/Contents/Resources/Shells.plist を編集する。XML ファイルなのでテキストエディタでも変更可能。tclsh の場合は引数にコマンドを指定できないので csh 等と同じ @ を使う。

  • args (array)

    コマンドに渡される引数。@ なら一時ファイル、% ならその場所に script キーの内容が埋め込まれる。

  • script (array)

    「引数の引き渡し方法」の「stdin へ」、「引数として」の初期値を設定する。テキストエディタの場合は &<> といった記号はそれぞれ &amp;&&lt;&gt; に置き換えなければならない。以前は改行やタブ等はそのまま記述していたが新しいバージョンでは &#10;&#09; に変更されたようだ。

diff の結果。

--- Run Shell Script.action/Contents/Resources/Shells.plist.default  2014-06-16 22:05:37.000000000 +0900
+++ Run Shell Script.action/Contents/Resources/Shells.plist   2014-06-18 16:23:21.000000000 +0900
@@ -132,5 +132,18 @@
        </array>
    </dict>
 
+   <key>/usr/bin/tclsh</key>
+   <dict>
+       <key>args</key>
+       <array>
+           <string>@</string>
+       </array>
+       <key>script</key>
+       <array>
+           <string>while {[gets stdin f] &gt;= 0} {&#10;&#09;puts $f&#10;}</string>
+           <string>foreach f $argv {&#10;&#09;puts $f&#10;}</string>
+       </array>
+   </dict>
+
 </dict>
-</plist>
\ No newline at end of file
+</plist>

Xcode がインストール済みならそちらで編集すると楽かも。スクリプト部分での改行は option+return。

Xcode


Automator のアクションを呼び出したところ。(Snow Leopard のアクションを流用しているので表示が少し違うかも)

Automator

Automator