macでダブルクリックでシェルスクリプトやPythonファイルを実行する

知っている人にとっては常識だったのかもしれませんが、タイトルの通りMacOSのパソコンで、シェルスクリプトファイルをダブルクリックで実行する方法を紹介します。

MacではWindowsのバッチファイル(.bat等)と違って、.sh とか .py ファイルを作ってもダブルクリックでは実行できないと最近まで勘違いしていました。

ただ、どうやら .command という拡張子でファイルを作って実行権限を付与しておくと、ダブルクリックで実行できるようです。

ちょっとデスクトップにサンプルディレクトリ作ってやってみます。
シェルスクリプトの中身は、文字列の表示(echo)、カレントディレクトリの表示、ファイルリストの表示、シェルの種類の表示、くらいにしておきましょかね。

$ mkdri sample_dir
$ cd sample_dir
$ vim test.command
# 以下の内容を記入して保存
echo "Hello world!"
pwd
ls
echo $SHELL

この時点でできてるファイルをダブルクリックしても、 「ファイル“test.command”は、適切なアクセス権限がないために実行できません。」 ってメッセージが表示されます。 chmod +x とか chmod 744 等して実行権限を付与します。

# 元の権限(見るだけ)
$ ls -l test.command
-rw-r--r--@ 1 yutaro  staff  39 12  4 00:22 test.command
# 所有者に実行権限付与
$ chmod u+x test.command
# 確認
$ ls -l test.command
-rwxr--r--@ 1 yutaro  staff  39 12  4 00:22 test.command

こうすると、このファイルをファインダーでダブルクリックするとターミナルが開いて以下の内容が表示されます。

/Users/yutaro/Desktop/sample_dir/test.command ; exit;
~ % /Users/yutaro/Desktop/sample_dir/test.command ; exit;
Hello world!
/Users/yutaro
# {色々散らかってるのでlsの結果は省略}
/bin/zsh

Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

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

zshで動きましたね。 exit; は勝手につけて動かしてくれるようです。
また、ユーザーのホームディレクトリで動いていることも確認できました。

ホームディレクトリで動くって点は注意が必要ですね。その.commandファイルが配置されているディレクトリで動いて欲しいことも多いと思います。ファイルが配置されているフォルダで動作させたい場合、スクリプトの先頭でcdして対応します。具体的には以下の1行をスクリプトの先頭に追記します。

cd "$(dirname "$0")"

次はスクリプトが動いた後、[プロセスが完了しました]の表示のまま、ターミナルが開きっぱなしになる点が気になるかもしれません。これはターミナルの設定を修正します。

iTerm2等を入れてる人もこれは標準ターミナルが動作してるので設定を変更する対象を間違えないようにしましょう。 ターミナルの設定のプロファイル> シェル のなかに、シェルの終了時: というオプションがあります。 これがウィンドウを閉じないになってると自動では閉じませんので、「シェルが正常に終了した場合は閉じる」にしておくと自動的に閉じることができます。

「ターミナル本体」の設定で挙動が変わってしまうので、.commandファイルごとに変えられないのが難点です。少々面倒ですが見逃せないエラーメッセージ等あるかもしれないので手動で閉じるようにした方がいいかもしれません。

さて、これでダブルクリックで動くシェルスクリプトファイルが作れましたが、同様にPythonのコードを動かすこともできます。 Pythonファイルと.commandファイルを個別に作成して、その.commandファイルの中でPythonファイルをキックしても良いのですが、.commandファイルの先頭に、シバンライン(#!で始まる実行するスクリプトを指定する文字列)を追加する方が1ファイルで済むのでシンプルです。 例えば次のように書きます。(ファイルの中身だけ書いています。chmod等は先ほどのファイルと同じように実行しておいてください)

#!/usr/bin/env python
for i in range(5):
    print(i)

(2行目以降はただのサンプルのPythonコードです。)

これで、拡張子を .py ではなく .command にして実行権限を付与しておけばダブルクリックで動くPythonファイルの完成です。

カテゴリーMac

コメントを残す

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