/usr/bin と /usr/local/bin | Ubuntu
Linux の標準規格である FHS( Filesystem Hierarchy Standard )を参考にしています。
概要
/usr/bin/- apt でインストールしたバイナリは、通常
/usr/binに配置されます /usr/binのバイナリは apt(dpkg)の管理対象です(apt upgradeやapt installによる更新、apt removeによる削除の対象)- 通常のユーザーが apt を通さずに直接触ることはありません
- apt でインストールしたバイナリは、通常
/usr/local/bin- apt を使わずにインストールしたバイナリ(
make installでインストールしたもの、GitHub で配布されているバイナリなど)は、/usr/local/binに配置します - apt 以外でインストールしたバイナリが自動で
/usr/local/binに置かれるとは限りません。明確な意図がない限り、慣習的に/usr/local/binに置きます
- apt を使わずにインストールしたバイナリ(
[!NOTE]
apt updateはパッケージの一覧を更新するだけで、バイナリは更新しません。バイナリを更新するのはapt upgrade/apt installです。
apt でインストールしたバイナリの配置先は /usr/bin だけではありません。パッケージによって次の場所にも配置されます。
/usr/sbin(システム管理用のバイナリ)/usr/lib/...(ライブラリや内部用のバイナリ)/opt(一部のサードパーティ製パッケージ)- snap でインストールしたものは
/snap/bin
注意点
/usr/local/bin への配置は「手動」が基本
apt を使わない場合は「自動でそこに配置される」わけではなく、インストール工程(スクリプトや手順書)がそこを指定しているだけです。
make installの場合: ソースコードの Makefile にPREFIX=/usr/localと書かれていることが多いため、結果としてそこにコピーされます- GitHub のバイナリ: ユーザーが手動で
mvコマンドを使い、/usr/local/binに移動させるのが一般的です
なぜ /usr/local/bin なのか
/usr/bin/foo に自作のバイナリを置くと、後日 sudo apt install foo を実行した際に、その自作ファイルが apt に上書きされるおそれがあります。
/usr/local/ 配下は、Debian / Ubuntu のポリシーで パッケージがファイルを置いてはいけない場所(管理者のために空けてある場所)です。このため、apt の管理対象外で、apt や apt upgrade によってファイルが上書き・削除されることはありません。OS をアップグレードしても消えません。
[!NOTE]
/usr/local/binのバイナリは残りますが、OS のアップグレードでライブラリが更新されると、自前でビルドしたバイナリが動かなくなる場合があります。アップグレード後に動作を確認してください。
$PATH の優先順位
Ubuntu の既定の PATH(/etc/environment)は、次の順にコマンドを探します。
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
つまり /usr/local/bin が /usr/bin より先に見られます。例えば OS 標準の python3(/usr/bin)があっても、/usr/local/bin に別の python3 を入れると、設定を変えずにそちらが優先されます。
[!WARNING] 同名のコマンドを
/usr/local/binに置くと、意図せず OS 標準のコマンドが隠れます。特にpython3などは、他のツールの動作に影響する場合があります。どちらが実行されるかはwhich -a python3やtype -a python3で確認できます。
[!NOTE]
sudoは、sudoers のsecure_pathに設定されたPATHを使います。対話シェルのPATHと異なる場合があります。
/bin と /usr/bin
Ubuntu 24.04 では、/bin は /usr/bin へのシンボリックリンクです(/sbin は /usr/sbin、/lib は /usr/lib。merged-usr)。22.04 でも、新規インストールでは同様です。
sbin (System Binaries)
システム管理のために使うバイナリです。root(スーパーユーザー)が使うことが多く、通常のユーザーの操作用ではありません。
| 種類 | 役割 | 主な内容 |
|---|---|---|
| bin (Binaries) | 全ユーザーが日常的に使うコマンド | ls, cd, grep, python3, git |
| sbin (System Binaries) | システム管理用のコマンド | fdisk(ディスク操作), iptables(ファイアウォール), reboot |
/usr/local/sbin と /usr/sbin の違い
/usr/sbin: apt でインストールされた、システム管理用のツール/usr/local/sbin: 管理者が手動(ビルドや直接配置)で入れた、システム管理用のツール