この前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!!!
疑問点
- 内部コマンドと外部コマンドの提供され方の違いは分かったような気がするけど、二つに役割の違いというか、分担みたいなものはあるのだろうか。。