shebang(シバン)とPATH(パス)

シェルスクリプトを書くときのメモ。

shebang

shebang(シバン、シェバン)とは、ファイルの1行目が#!から始まっていたら、そのコマンドに2行目以降の全てを渡すというもの。

シェルスクリプトのファイル名は慣習として拡張子.sh

<hello.sh>

#!/bin/sh

echo "Hello World!"

これは、#!の後に書かれている/bin/sh(シェル)というプログラムに、echo "Hello World!"を実行させているだけ。

たとえばRubyのプログラムなら、以下のように#!の後にrubyのありかを書けばいい。

#!/usr/bin/ruby

puts "Hello World!"

PATH

プログラムのありかのことをパスといい、whichコマンドで調べることができる。Pathとは「進路、道」という意味。

$ which sh
/bin/sh

さっきのファイルを実行するときは(カレントディレクトリのファイルならば)以下のようになる。

<ターミナル>

$ ./hello.sh
Hello World!

(ファイルの実行権限がないと実行できないので注意)

実行するためにはファイルのパスを入力しなければならないが、ファイルが深いディレクトリにあったりすると、スクリプトを実行するときいちいちフルパス入力するのは面倒。環境変数$PATHを利用して、ファイル名だけで実行できるようにしたい。

$PATHにあるディレクトリのプログラムは、ディレクトリ名を省略して実行することができる。これを「パスが通っている」と言ったりする。(参考:"パスが通っている"とは

まず、現在の$PATHを確認。

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

少し見にくいが、/usr/local/bin/usr/bin/bin/usr/sbin/sbinディレクトリがあることがわかる。

次に、例としてlsコマンドのありかを確認。

$ which ls
/bin/ls

lsも、実はパスが通っているからファイル名のlsだけで実行できるのだ。フルパス/bin/lsを入力してももちろん実行できる。

自分で作ったスクリプトは、ホームディレクトリにbinというディレクトリを作ってそこに入れる人が多いらしい。ということで、やってみた。

binディレクトリを作って、スクリプトをbinディレクトリへ移動しておく。

パスの通し方

ホームディレクトリに.bash_profileというファイルを作り、以下を記述。

export PATH=$PATH:~/bin

.bash_profileはログイン時に読み込まれるファイルなので、ターミナルを再起動するか$ source ~/.bash_profileで読み込む。

$PATHを再度確認。

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/name/bin

/Users/name/binが追加されている(nameの部分はユーザー名が入る)。

これで、どこのディレクトリにいてもファイル名だけで実行できるようになった。

$ hello.sh
Hello World!

ディレクトリの優先順位

ちなみに、PATH=$PATH:~/binは現在の$PATHの後ろに:~/binを追加するという意味。

スクリプトを実行するとき、$PATHディレクトリの頭(左)から順番に一致するファイルを探していく。

自分の作ったスクリプトを優先させたいときは、以下のように$PATHの前に~/bin:を書けばいい。

<.bash_profile>

export PATH=~/bin:$PATH

binとは

ついでに、プログラムが入っているディレクトリ名のbinについて。

binはbinary(バイナリ)からきていて、binaryは「2つの」という意味。二進数のことをbinary numberといったり。

コンピュータが理解できるのは0と1だけなので、実行ファイルのことをバイナリファイルと呼ぶ。

バイナリファイルを入れるからbin。ということらしい。