この前Scalatraを使うためにConscriptというものをインストールしてて、こいつが~/binディレクトリを作っていて、あれ、そこなんやと思い調べてみた。
それぞれのbinディレクトリの役割と、あるプログラムをビルド・インストールする時に、/binか、/usr/binか、~/binどこが適切なのかについて。
まずbinってなんや
まずbinってなんなんや。
binとは、Binary codeのことでようするに実行可能プログラム置き場ということ。バイナリということはコンパイル型の言語により作られたプログラムが置かれるのだろう。
そしてLinuxのディレクトリ構成については以下の記事がすごくよかった。ここで読めておいてよかったなと思った。
/bin
まずは/binについて
/binには、FHSによって定められたシングルユーザを含めたどのユーザでも使えるコマンドだけが入る。FHSの定めたコマンドにも必須のもの(cat, lsとか)とOSごとに選択できるもの(tar, pingとか)があるらしい。
ここにその一覧がのってた。
また、
/binは、NFSを使ってネットワークで共有したり、ROMに収めたりすることを想定していますから、ここにユーザーが新たにコマンドをインストールするべきではありません。
http://www.atmarkit.co.jp/ait/articles/0108/07/news002_2.html
とのことで、よほどのことがない限りここにコマンドを追加する必要はなさそう。
ちなみに自分のMacでは、
$ ls /bin
date expr ln pwd stty zsh
bash dd hostname ls rcp sync
cat df kill mkdir rm tcsh
chmod domainname ksh mv rmdir test
cp echo launchctl pax sh unlink
csh ed link ps sleep wait4path
といった感じだった。zshとかは自分で追加したとして、sleepやwait4pathはもともとOS Xの/binに追加されてるみたい。
wait4pathコマンドについは以下。公式のドキュメントがあった。
個人的にはFHSの/binの定義に超重要な(と思っていた)cdコマンドがないのが面白いなと思った。それだけ/binはツリーの根の部分で作業するために最低限にあるコマンドなのかなと思った。
/usr/bin
続いて/usr/binについて。
ユーザーが一般的に使用するコマンドで、
緊急時のシステム保守に必須ではないコマンドが配置されます。
http://www.linuxmaster.jp/linux_skill/2010/02/06linux.html
また、/usr/sbinについては、
システム管理コマンドで、緊急時のシステム保守に必須ではないコマンドが配置されます。
http://www.linuxmaster.jp/linux_skill/2010/02/06linux.html
とある。
なるほど、/binがOSの働きの根幹に関わるような役割をもつコマンドがはいっているのにたいして、/usr/binにはそれよりももっと一般的に使われるようなコマンドが主に入っているみたいだ。
自分のPCだと、gitやviがここに入っていた。
~/bin
そして~/binについて。
これまで二つのbinディレクトリの役割からも分かるように、これはログインしているユーザに依存したコマンドを格納することになる。
自分でプログラムをインストールしたりするときは基本的に~/bin以下にインストールするのが良い気がする。例えばサーバー用のOSで他のユーザと共有となってしまう形で、コマンドを叩けるプログラムをぼんぼんインストールすべきでないと思うし。
この方のスクリプトとかすごく参考になる。
自分で何かツールとかを作った時には、~/binにインストールする設定で書くようにしようと思った。
(Conscript、いけてるやん。。。)
おわり
ということでbinについて気になったので調べてみたら、思いのほかすごくおもしろかった。
逆に今まで何故疑問をいだいてググらなかったのだろうと後悔してるけど、当たり前になってしまったこともこれからは積極的にググって理解するようにしたいと思った。
最後まで読んでいただいてありがとうございました。何か間違ったところなどあればご指摘いただけるととてもうれしいです。
追記
2015/03/27 (Wed) 1:37
cdコマンドが/binに入っていないことに言及しましたが、cdやpwdなどは内部コマンドと呼ばれるシェルの機能として提供されているとのことです。
ちなみにbashのコマンドリストは以下に一覧がまとまっています。
一方binディレクトリ内部で実行可能なプログラムとして置かれているものは外部コマンドと呼ばれています。
コマンドがどちらに属するかは$ typeコマンドで調べることが出来ます!!type!!!
疑問点
- 内部コマンドと外部コマンドの提供され方の違いは分かったような気がするけど、二つに役割の違いというか、分担みたいなものはあるのだろうか。。