そもそもXDGベースディレクトリとは
XDGベースディレクトリとは、特定のユーザー配下のディレクトリに対して、
そのディレクトリが設定ファイルを保有するのか、それとも、データとしてのファイルを保有するのかといったルールを決めて、定義する方法です。
つまりは、ルート(/)に対して、/etcが設定ファイル、/devがデバイスファイルのようにファイルの置き場所を分けるようなことを、各ユーザー配下でも行っていこうというものです。
パッケージのインストールの際や、アプリケーションが動作する際に、環境変数として値を与えることで、定義されたパスのなかにファイルが配置されます。
各ディレクトリについて
-
$ XDG_DATA_HOME
ユーザー特有のデータのファイルが配置されるディレクトリです。
イメージ的には、/usr/shareディレクトリに近いものです
デフォルトでは、$HOME/.local/shareを使用します
(echo $XDG_DATA_HOMEの実行で何も表示されない場合、デフォルトが設定されています)
-
$ XDG_CONFIG_HOME
ユーザー特有の設定ファイルが配置されるディレクトリです
イメージ的には、/etcディレクトリに近いものです
デフォルトでは$HOME/.configを使用します
(echo $XDG_CONFIG_HOMEの実行で何も表示されない場合、デフォルトが設定されています)
-
$ XDG_STATE_HOME
ユーザー特有のステートファイル(アプリケーションの現在の状態)が配置されるディレクトリです
イメージ的には、/var/libに近いものです
デフォルトでは、$HOME/.local/stateを使用します
(echo $XDG_STATE_HOMEの実行で何も表示されない場合、デフォルトが設定されています)
-
$ XDG_CACHE_HOME
ユーザー特有のキャッシュファイルが配置されるディレクトリです。
イメージ的には、/var/cacheが近いです。
デフォルトでは、$HOME/.cacheが使用されています。
-
$ XDG_DATA_DIRS
$ XDG_DATA_HOMEを検索した結果、存在しなかったりして、それを使わない際に
複数のディレクトリを指定し、どのディレクトリを使うかの順番を定義するものです。
PATHと同じように:で分割して、ディレクトリを記載します
デフォルトでは、/usr/local/share:/usr/shareが使用されています
-
XDG_CONFIG_DIRS
$ XDG_CONFIG_HOMEを検索した結果、存在しないなどの理由でそれを使わない際に、
複数のディレクトリを指定し、どのディレクトリを使うかの順番を定義するものです。
デフォルトでは、/etc/xdgが使用されます
-
$ XDG_RUNTIME_DIRS
ランタイムに関するファイルやソケットなどが置かれる揮発性のディレクトリ
- 揮発性なのでログインしている間にデータを保持します
- 揮発性なので、リブートによりデータは失われます
- パーミッションは
0700である必要があります - ファイルシステムは、OSのものに準拠している必要があります
- ローカルシステムに置かなければなりません
- Periodic Cleanupにより削除されます
- 上記による削除を回避し、保存するためには、最低6時間ごとのtimestampの
単調増加(monotonic)の更新か、スティッキービットの設定が必要です - メモリ上のtmpfsにマウントされるため、大きなファイルは保存できません
- デフォルトでは、
run/user/XXXXに置かれます
まとめ
環境変数として規格に沿って管理できるのは便利で、カスタマイズ性も高いですね
$ printenv | grep XDGでどのディレクトリが設定されているかを確認することができます。
表示されない項目がある場合には明示的にexportすることでシェル上で設定することもできます
(筆者の環境では、$ XDG_CONFIG_HOMEはgrepしても出てきませんでした)