2010年10月10日日曜日

(Linux等の)シェルスクリプトを Mac の Finder からダブルクリックで実行するには

少し躓いたので、メモメモ。まとめると次の3点が要点となる。

  1. スクリプトの拡張子を .command にする
  2. ターミナルから、chmod で実行権限を与える
  3. スクリプトの Shebang のすぐ下に cd `dirname $0` を入れる (シングルではなくバッククオートであることに注意)

詳細について。まず、シェルスクリプトの書き方から。これは Linux と同様 Shebang ではじめ、通常通りコードを書いていく。

#!/bin/sh

[ここからコード]

このスクリプトファイルをダブルクリックした時にターミナルを起動するように設定する必要がある。Mac 上で拡張子の関連付けを行えばよいことになるが、10.6 (Snow Leopard) では、デフォルトで ".command" という拡張子がターミナルに関連付けられいることを確認した。"install.command" のような感じで拡張子をつけて保存するとよい。(もちろん別の拡張子を利用したい場合はその拡張子をターミナルに関連付けておく)

また、Linux と同様にスクリプトには実行権限を付加しておく必要がある。これは Mac 標準の Finder からは設定できないようなので、ターミナルから実行権限を付加する。例えばコードが install.command だった場合、

chmod +x install.command

もちろん、ファイルがホームディレクトリに無い場合は、該当のディレクトリに移動するか、フルパス指定で実行。

ただし、Mac ではダブルクリックで起動した場合、ホームディレクトリをカレントディレクトリとしてコードが実行されてしまう。例えば、ユーザー名が hoge、コードが /Users/hoge/abc/install.command においてある場合、Mac は自動的にホームディレクトリでコードを実行してしまう(下の太字の部分が Mac が実際に実行しているコマンド)。

Last login Sun Oct 10 22:54:02 on Console
pcname:~ hoge$ /Users/hoge/abc/install.command ; exit;
[コマンド実行結果]
logout

[プロセスが完了しました]

コード内で相対パスを利用している場合、コードの置いてあるディレクトリにカレントディレクトリを移動させないと不具合が出る場合がある。これを行うためには、例えば "cd `dirname $0`" というコードをシェルスクリプトの冒頭に入れておけばいい(シングルではなくバッククオートであることに注意)。これは、コードのパスからディレクトリを dirname で取得し、その結果を cd に渡すことでカレントディレクトリを適切なところに移動するコードである。

結局、スクリプトは次のように書けばよいことになる。

#!/bin/sh
cd `dirname $0`

[ここからコード]

0 件のコメント:

コメントを投稿