シェルスクリプトを書くときのメモ。
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。ということらしい。