自作スクリプトをコマンドっぽく実行する

先日、簡単なスクリプトを作ってみた。これを、コマンドっぽく実行できるようにする方法。

Ruby 改行を削除するスクリプト - No Solution for Life

手順

  1. ファイルに実行権限をつける
  2. ディレクトリを用意して PATH を通す

詳しいやり方

通常ファイルの実行方法

たとえばdelete_n.rbという Ruby ファイルを実行する場合、ターミナルに以下のように入力すると思う。

$ ruby delete_n.rb

ファイルに実行権限をつける

まず、delete_n.rbのファイルの先頭に、以下のように shebang(シバン、シェバン)と呼ばれる、ファイルの2行目以降を指定したコマンド(ここではruby)に渡す処理を書く。

#!/usr/bin/env ruby

先日のブログでは説明を省略してしまったが、以下のようにしてファイルに実行権限をつけると、./ファイル名で実行できるようになる。

# ファイルに実行権限(x)をつける
$ chmod 744 delete_n.rb  または  $ chmod u+x delete_n.rb

$ ./delete_n.rb

./はカレントディレクトリを表しているので、自分がいるディレクトリが変われば、入力も変わることになる。それだとコマンドとして実行するには困るので、どこからでも実行できるようにしたい。

コマンドの正体

よく使うlsコマンドは、実はlsというファイルを実行しているだけだ。自分で書いたスクリプトも、そんな風に実行できるようにしたい。

lsというファイルはどこにあるのか?whichコマンドで調べてみる。

$ which ls
/bin/ls

/bin/lsという場所にあることがわかった。これはなぜlsだけで実行できるのか。答えは、PATH(パス)が通っているから。

$PATHという環境変数に登録されているディレクトリ内のファイルは、ファイル名だけで実行が可能になる。以下のコマンドで確認できる。PATH が通っているディレクトリが:区切りで出力される。

$ echo $PATH

/binというディレクトリが確認できるはずだ。

自作スクリプトの場合は、ホームディレクトリにそれ用のディレクトリを作って、PATH を通すことが多い。

ディレクトリを作って PATH を通す

ということで、ホームディレクトリにbinというディレクトリを作って、delete_n.rbを入れた。次に、~/binに PATH を通す。

自分は bash を使っているので、ホームディレクトリの .bash_profileというファイル(なかったら作る)に以下のように記述。

.bash_profile

export PATH=$PATH:~/bin

ターミナルを再起動して $ echo $PATH/Users/ユーザー名/bin が確認できれば OK。

これでどこのディレクトリからでも$ delete_n.rbのようにファイル名だけで実行できるようになる。それでもコマンドにしては長いので、ファイル名をもっと短くしたらいい。ただし、既存のコマンドと名前がかぶらないように注意。

PATH の優先順位

もし名前がかぶったときは、$PATHで表示されるディレクトリの左から順番に探索される。

ちなみに、export PATH=$PATH:~/binのように$PATHの右側にディレクトリを書くと、末尾(右側)に追加される。~/bin:$PATHのように左側に書くと先頭に追加される。

PATH の通し方については、.bashrc に書くという記事も見かけるが、以下の記事を読んで .bash_profile にした。もし違ったら教えてください。

本当に正しい .bashrc と .bash_profile の使ひ分け - Qiita