これは、なにをしたくて書いたもの?
自分で作ったよく使うスクリプトや、パッケージ管理されていないバイナリーなどは癖で/usr/local/binディレクトリーに
置くことが多いのですが、そういえば環境変数$PATHには$HOME/.local/binっていうディレクトリーも設定して
あったな?ということに前々から気づいていたのですが。
この$HOME/.local/binディレクトリーが何者か調べたことがなかったので、今回ちょっと見てみました。
XDG Base Directory Specification
結論を言うと、$HOME/.local/binディレクトリーはXDG Base Directory Specificationで定められたディレクトリーの
ひとつです。
XDG Base Directory Specification
こちらですね。
User-specific executable files may be stored in $HOME/.local/bin. Distributions should ensure this directory shows up in the UNIX $PATH environment variable, at an appropriate place.
XDG Base Directory Specification / Environment variables
ユーザー固有の実行可能ファイルが置かれるかもしれないというディレクトリーであり、ディストリビューションは
$PATH環境変数に設定する必要があることが書かれています。
$HOMEを異なるアーキテクチャーのシステム間で共有する場合には注意した方がよいとは書かれていますが、たいていの
場合には問題にならないでしょう。
Since $HOME might be shared between systems of different achitectures, installing compiled binaries to $HOME/.local/bin could cause problems when used on systems of differing architectures. This is often not a problem, but the fact that $HOME becomes partially achitecture-specific if compiled binaries are placed in it should be kept in mind.
その他、XDG Base Directory Specificationには以下のディレクトリーを表す環境変数が記載されています。
- $XDG_DATA_HOME … ユーザー固有のデータファイルを書き込む相対的なベースディレクトリー
- $HOME/.local/share
- $XDG_CONFIG_HOME … ユーザー固有の設定ファイルを書き込む相対的なベースディレクトリー
- $HOME/.config
- $XDG_STATE_HOME … ユーザー固有の状態データを書き込む相対的なベースディレクトリー
- $HOME/.local/state
- $XDG_DATA_DIRS … データファイルの検索対象となる、優先順位が付けられた一連のベースディレクトリー
- /usr/local/share/:/usr/share/
- $XDG_CONFIG_DIRS … 設定ファイルを検索する基準となる、優先順位が付けられた一連のベースディレクトリー
- $XDG_CACHE_HOME … ユーザー固有のキャッシュされたデータを書き込むための相対的なベースディレクトリー
- $HOME/.cache
- $XDG_RUNTIME_DIR … ユーザー固有のランタイムファイルやその他のファイルオブジェクトを配置する相対的なベースディレクトリー
関連するディレクトリーも少し載せておきました。
その他の参考)
では、$HOME/.local/binディレクトリーについて簡単に確認しておきましょう。
環境
今回の環境はこちら。Ubuntu Linux 24.04 LTSです。
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04.2 LTS Release: 24.04 Codename: noble $ uname -srvmpio Linux 6.8.0-55-generic #57-Ubuntu SMP PREEMPT_DYNAMIC Wed Feb 12 23:42:21 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
$HOME/.local/binディレクトリーについて確認する
$HOME/.local/binディレクトリーをどこで$PATHに追加しているかというと、$HOME/.profileのようです。
$ tail -n 3 $HOME/.profile
if [ -d "$HOME/.local/bin" ] ; then
PATH="$HOME/.local/bin:$PATH"
fi
$HOME/.local/binディレクトリーが存在していれば、$PATHに追加するという動作のようです。
というわけで、/etc/skel/.profileに元ネタがありますね。
$ tail -n 3 /etc/skel/.profile
if [ -d "$HOME/.local/bin" ] ; then
PATH="$HOME/.local/bin:$PATH"
fi
試してみましょう。
$HOME/.local/binディレクトリーがない状態からスタートします。
$ ll $HOME/.local ls: '$HOME/.local' にアクセスできません: そのようなファイルやディレクトリはありません
$PATHには$HOME/.local/binディレクトリーはありません。
$ printenv PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$HOME/.local/binディレクトリーを作成します。
$ mkdir -p $HOME/.local/bin
シェルに入り直すと、$HOME/.local/binディレクトリーが$PATHに追加されました。
$ printenv PATH $HOME/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
シェルスクリプトを置いてみます。
$HOME/.local/bin/hello.sh
#!/usr/bin/bash echo 'Hello World'
確認。
$ chmod +x $HOME/.local/bin/hello.sh $ hello.sh Hello World
OKですね。
おわりに
$HOME/.local/binディレクトリーについて確認してみました。
いつもの癖でついつい/usr/local/binディレクトリーを使うことが多かったのですが、別にこういった全体で共通の
ディレクトリーに置きたいわけではなかったので、今度から$HOME/.local/binディレクトリーを使うことにしましょう。