AppleScript を使わずに iTerm2 や Terminal に好きなコマンドを渡す

AppleScript を使わずにターミナルエミュレーターに好きなコマンドを渡すネタ。

よく、ローカルにあるファイルを Finder からターミナルにドラッグして nanoemacs で開くことがある。ただ、キーボードでコマンドを入力してドラッグでパス入力というのはなんだか面倒。そこで、Automator でサービスを作ることにした。

しかし、「シェルスクリプトを実行」アクションで

/bin/bash(args)
nano "$@"

とやっても内部でやってしまうのでターミナルは立ち上がらない(裏で延々と nano が実行される)。

xterm の場合、起動オプションが指定出来るので、

bash
xterm -e bash -c "nano "$@""

とすることができるけど、iTerm2 や標準の Terminal を軽く調べた感じではこれに似たオプションはないみたい。できることと言えば引数を1つだけ拾って実行するということ。

例えば、

bash
/Applications/iTerm.app/Contents/MacOS/iTerm nano file

と書いても file の部分は受け取らない。色々調べてみたけど AppleScript を書いてる人が多いみたい。自分も AppleScript で書こうかな〜と思ったけど、AppleScript とシェルクリプトの書式は相性が悪い(と思っている)のであまり好きじゃない。

とりあえず、引数を1つだけ受け取るならそのファイルにコマンドとファイル名を書いて実行させちゃえばいいじゃない、というわけで「シェルスクリプトを作成するシェルスクリプト」を書いてみた。Automator のテンプレートは「サービス」、入力の引き渡し方法は「引数として」に設定しておく。

/bin/bash(args)
tmp=/tmp/'$$'$$'$$'
{
cat <<EOF > ${tmp}
#!/bin/bash

nano "$1"
EOF
chmod +x ${tmp}
} && {
open ${tmp}
} && {
sleep 5
rm ${tmp}
}
  1. 変数 tmp に一時ファイルのパスを代入する。($$PID$$ という名前のファイルが作成される)
  2. cat とヒアドキュメントを使ってシェルスクリプトを書き、リダイレクトで一時ファイルへ書き出す。
  3. chmod で一時ファイルに実行権限を付加する。
  4. open コマンドで一時ファイルを開く。(アプリケーションの指定が無い場合はデフォルトのターミナルエミュレーターで開かれる)
  5. 適当に時間が経ったら一時ファイルを削除する。(すぐに rm してしまうと nano がファイルを開く前に消されてしまう)


{} がついているのは中の処理をグルーピングして、失敗した場合に次のコマンドを実行しないようにするため。一時ファイルは再起動時に削除されるので放っておいてもかまわない。


echo コマンドを使う場合

!]はバックスラッシュでエスケープするかシングルクオートを使う。

bash
{
echo "#\!/bin/bash"
echo
echo "nano \"$1\""
} > ${tmp}

-e]オプションで一行書きしてもOK。

bash
echo -e "#\!/bin/bash\n\nnano \"$1\"" > ${tmp}

サンプルはいつものところに置いておきます。

http://code.google.com/p/mattintosh4-devel/downloads/list

Trackback