Linuxの/bin、/usr/bin、$HOME/binのそれぞれの役割

  • 96
    Like
  • 2
    Comment

この前Scalatraを使うためにConscriptというものをインストールしてて、こいつが~/binディレクトリを作っていて、あれ、そこなんやと思い調べてみた。

それぞれのbinディレクトリの役割と、あるプログラムをビルド・インストールする時に、/binか、/usr/binか、~/binどこが適切なのかについて。

まずbinってなんや

まずbinってなんなんや。

binとは、Binary codeのことでようするに実行可能プログラム置き場ということ。バイナリということはコンパイル型の言語により作られたプログラムが置かれるのだろう。

そしてLinuxのディレクトリ構成については以下の記事がすごくよかった。ここで読めておいてよかったなと思った。

http://www.atmarkit.co.jp/ait/articles/0108/07/news002.html

/bin

まずは/binについて

/binには、FHSによって定められたシングルユーザを含めたどのユーザでも使えるコマンドだけが入る。FHSの定めたコマンドにも必須のもの(cat, lsとか)とOSごとに選択できるもの(tar, pingとか)があるらしい。

ここにその一覧がのってた。

http://www.pathname.com/fhs/2.2/fhs-3.4.html

また、

/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とかは自分で追加したとして、sleepwait4pathはもともとOS Xの/binに追加されてるみたい。

wait4pathコマンドについは以下。公式のドキュメントがあった。

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/wait4path.1.html

個人的には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だと、gitviがここに入っていた。

~/bin

そして~/binについて。

これまで二つのbinディレクトリの役割からも分かるように、これはログインしているユーザに依存したコマンドを格納することになる。

自分でプログラムをインストールしたりするときは基本的に~/bin以下にインストールするのが良い気がする。例えばサーバー用のOSで他のユーザと共有となってしまう形で、コマンドを叩けるプログラムをぼんぼんインストールすべきでないと思うし。

この方のスクリプトとかすごく参考になる。

http://tyru.hatenablog.com/entry/20090510/1241935374

自分で何かツールとかを作った時には、~/binにインストールする設定で書くようにしようと思った。

(Conscript、いけてるやん。。。)

おわり

ということでbinについて気になったので調べてみたら、思いのほかすごくおもしろかった。

逆に今まで何故疑問をいだいてググらなかったのだろうと後悔してるけど、当たり前になってしまったこともこれからは積極的にググって理解するようにしたいと思った。

最後まで読んでいただいてありがとうございました。何か間違ったところなどあればご指摘いただけるととてもうれしいです。

追記

2015/03/27 (Wed) 1:37

cdコマンドが/binに入っていないことに言及しましたが、cdpwdなどは内部コマンドと呼ばれるシェルの機能として提供されているとのことです。

http://begi.net/read/base/11.html

ちなみにbashのコマンドリストは以下に一覧がまとまっています。

http://ss64.com/bash/

一方binディレクトリ内部で実行可能なプログラムとして置かれているものは外部コマンドと呼ばれています。

コマンドがどちらに属するかは$ typeコマンドで調べることが出来ます!!type!!!

疑問点

  • 内部コマンドと外部コマンドの提供され方の違いは分かったような気がするけど、二つに役割の違いというか、分担みたいなものはあるのだろうか。。