Linux 整理魔法:整理 Linux 家目录

2020年03月09日

杂乱的家目录一直是 Linux 环境中恼人和广为诟病的话题,每天面对它们,Linux 的使用体验就好不到哪去。

直到有一天,我看到了 archwiki 上的 XDG Base Directory, 一切便瞬间豁然明朗起来。

Linux 软件一般都提供修改环境变量的方法来修改自身的默认行为,当然文件的存放 路径也可修改!不仅限于配置文件,还包括了缓存等文件。比如命令less的历史记录在~/.lesshst, 通过变量LESSHISTFILE可以指定到~/.data/less/history

但是软件众多,需要一个个去设置吗?不用慌,按照 archwiki 上众人总结的规则,相信你很快就能把家目录整理好。

本文总结了我在整理家目录过程中的实际经验,希望你能借鉴到我的经验,打造一个干净舒适易于维护的用户家目录, 让 Linux 使用效率更上一层。

三个关键目录

既然要用到环境变量来管理我们的文件,需要我们注意到几个前提条件。有三个环境变量,对应着我们所关心的三个目录:

  • XDG_CONFIG_HOME

    用户配置。重点备份对象。

  • XDG_DATA_HOME

    存放插件、日志、历史记录、离线资源等数据文件,通常来说文件较大,有反复使用的价值,建议保留 里面的文件。

  • XDG_CACHE_HOME

    缓存文件。可以安全清理不再需要的缓存。

强烈推荐设置这三个环境变量。首先这三个变量并没有默认值,也就是说这些变量不存在,值为空。 至少在我的 Arch Linux 上是默认不存在的。如果发现被设置了,考虑一下是哪些环境悄悄做出的行为。

为什么一些 Linux 软件在我们没有设置该变量值的情况下,还是能正确选择家目录下的.config.cache.local/share存放文件呢?那是因为软件按照 XDG 的规则,软件运行时需要先判断这几个 变量是否为空,如果有值就用这个值;如果没有值就默认选择家目录下的.config.cache.local/share

虽然现在不少 Linux 软件已经遵守了 XDG 这一套文件存放规则,但是我们想直接引用这三个变量就麻烦了,同样的道理, 我们要先判断值为空的情况下采用默认路径。脚本里实现检测它们不麻烦,但不是所有地方都允许运行脚本, 比如一些软件的配置只能引用变量。而且,我更倾向于将XDG_DATA_HOME设置为~/.data。综合利弊, 我选择设置这三个环境变量,尽管不设置时,大部分现在软件也能正确找到他们的文件位置。

不得不提 wps 这类软件压根不鸟你的XDG_DATA_HOME设置成了什么,依旧我行我素把文件放在~/.local/share

由于一般没有什么人会去改动XDG_CONFIG_HOME,所以下文我就用~/.config指代XDG_CONFIG_HOME好了。如果 你确实修改了这个变量,那就时刻记着在脑海里替换~/.config为你指定的值,再接着阅读下文吧!

管理环境变量

家目录下有两处地方可以用来设置早期的环境变量:

  • ~/.pam_environment
  • ~/.zshenv (zsh) 或者~/.bash_profile (bash)

对于把 zsh 用作登录 shell 的用户来说,.zshenv是 zsh 用来设置环境变量的。但是,我还是更喜欢用 ~/.pam_environment,因为 PAM 设置环境变量发生在登录阶段后,比启动 shell 更早。 最明显的好处是可以用变量ZDOTDIR把 zsh 的配置安排在~/.config/zsh下。 ~/.pam_environment的短板是缺乏复杂的判断语句,只适合简单直白的 变量赋值;而且不是所有 Linux 环境都支持通过该文件设置环境变量。

推荐用~/.pam_environment设置环境变量。

通过环境变量修改文件路径

这才是本文的重点,本文的目的是告诉你,绝大部分的 Linux 软件完全可以通过设置环境变量来修改默认的文件存放路径; 按照 XDG Base Directory 上的表格提供 的方法,针对不同软件的行为,可以很快地就把那些在家目录下的文件移动到上面提到的三个关键目录里面去。 由于 archwiki 给出的方法已经很明确了,可以完全按照表格进行配置,所以我在本文就不再赘述了。

额外的提醒下,如果用到上面所说的~/.pam_environment,就可以用变量ZDOTDIR把 zsh 的配置 包括~/.zshenv移动到.config/zsh里面(并非是表格中所说的那样必须修改/etc/zsh/zshenv)。

可以看看 我是怎么做的

关于~/.python_history,通过PYTHONSTARTUP变量指定一个配置文件,此文件可以修改 readline 的历史保存路径。 可以仿照 我的配置

至于~/.gnupg我没有更改,毕竟它的路径被认为熟知路径,相较于移动它带来的各种麻烦, 家目录的整洁显得不重要了。

此外 archwiki 上的表格也告诉我们,并不是所有的文件都可以通过变量去修改它们的存放路径。所以除了继续忍耐它们的 存在,还得督促这些软件早日遵守 XDG 规范。

XDG 用户目录

Arch 用户参考 archwiki 页面 XDG user directories, 把家目录下面的「下载、桌面、文档」等等用户目录通通赶到别处去!

~/.config/user-dirs.conf

1
2
3
4
5
6
7
8
XDG_DESKTOP_DIR="$HOME/Userdata/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Userdata/Downloads"
XDG_TEMPLATES_DIR="$HOME/Userdata/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Userdata/Public"
XDG_DOCUMENTS_DIR="$HOME/Userdata/Documents"
XDG_MUSIC_DIR="$HOME/Userdata/Music"
XDG_PICTURES_DIR="$HOME/Userdata/Pictures"
XDG_VIDEOS_DIR="$HOME/Userdata/Videos"

可以看到我把它们放到一个目录下面去了。并且我指定了它们为英文名。

由于存在我尚不理解的 XDG 机制,文件~/.config/user-dirs.conf中的设置会在使用命令 xdg-user-dirs-update后被修改,所以我在另一个文件~/.config/user-dirs.conf中添加了一行:

1
enabled=False

xdg-user-dirs 提供了一些实用工具(不是必须安装的), 此外附带一个 systemd 服务文件,通过用户身份启动此服务xdg-user-dirs-update.service, 这样每次登录都会确保这些目录存在。(如果目录不存在就自动创建)

1
systemctl enable --user xdg-user-dirs-update.service

用户的配置都归用户

我很欣赏的良好习惯是尽量不使用 root 权限去修改/etc,与自己相关的配置都保持在家目录下面。 只有系统服务的配置才需要去修改/etc,甚至最好与自己有关的服务都尽量以自己的用户身份启动。比如说, 修改 X11 环境下的字体配置,我没有选择修改/etc/fonts/conf.d/etc/fonts/fonts.conf, 转而使用~/.config/fontconfig/conf.d~/.config/fontconfig/fonts.conf

有人会问,配置都在用户家目录了,同主机下的多用户要怎么共享配置呢?以我的观点来看,如果都已经多用户了, 那说明更需要做用户隔离,尽管这多个用户都是同一个人在使用,也不能因为贪图方便轻易地破坏配置的差异性和隔离性。 直接修改/etc 不是好习惯,也许有人会采用/etc/skel的方式,但这个方法却只在新建用户的时候才能同步配置。

在本系列的 下一篇文章 里我会介绍如何用 git 更加有效地管理和同步家目录下的配置, 所以就暂时搁置这个问题吧。

附:修改 firefox 配置的路径

firefox 的配置位于~/.mozilla/firefox,棘手的问题是,firefox 支持多个配置目录,所以目录名 为了保持唯一性,会自动生成XXX.XXX-release或者XXXXXX.default的目录名。 如果我们想把 firefox 的配置目录也纳入管理, 可不可以重命名这些目录呢?显然不能直接修改。需要注意,使用 firefox 的配置管理器 firefox --ProfileManager改名,是不会修改目录名的,修改后的配置名称仅在火狐内可见。 至于手动修改~/.mozilla/firefox下的profiles.iniinstalls.ini…貌似不管用,我初步尝试后无效。

所以就别手动改了,不仅麻烦还容易出错。直接用 firefox 帮我们改名吧!新的默认配置目录就叫做profile好了。

reddit 上有个办法, 里面提到了使用about:profiles。但我偏向于选择ProfileManager的方式。

还是用 firefox 的配置管理器firefox --ProfileManager,但是这次需要点技巧:

首先在~/.mozilla/firefox下,复制配置目录到新目录profile:

1
2
# 诸如 fp7q3e3q.default-release 之类的就是旧目录
cp -r ~/.mozilla/firefox/fp7q3e3q.default-release ~/.mozilla/firefox/profile

暂时先把旧目录当作一个备份处理。

然后启动配置管理器firefox --ProfileManager,选择创建新配置文件。配置名自由决定,default就行。 重点来了,这一步选择复制后的新目录,也就是上文所说的~/.mozilla/firefox/profile。 注意在这个创建配置向导对话框中,必须先输入配置名字再选择目录。否则,输入新的配置名字后会生成新的随机目录, 此时不得不重新选择目录。务必确认再进行下一步!

在配置管理器界面,确认选中了新配置,并且勾选设为默认。

从此,firefox 每次启动就使用新的目录~/.mozilla/firefox/profile。所有配置和旧的一样。 复制配置到新的机器上也可以按我说的方式操作。

最后确认一切无误后,删掉旧目录即可。

如果选择使用about:profiles而不是配置管理器进行上述操作,原理是一样的。

整理完毕

整理完成后——除了欣赏成果,还有呢?接下来让我们高效率地对配置文件进行备份和同步吧。不过,这个话题 就要到本系列的 下一篇文章 (使用 Git 管理 Linux 用户配置的新思路) 当中讨论了。

CC BY-NC-SA 4.0

© 2020-2024 rydesun