一、/etc/profile.d 这个目录是干什么的?
- 作用:放系统级的 shell 启动脚本 (主要是
.sh、.csh等),在用户登录时自动执行,用来统一设置环境变量、路径、别名等。 - 被谁执行:
- 对 bash、sh 等 Bourne 风格 shell:由
/etc/profile这个"总入口"脚本来调用这个目录下所有*.sh文件。 - 对 csh、tcsh 等 C shell:类似逻辑,用
/etc/csh.cshrc或/etc/csh.login去调用*.csh文件。
- 对 bash、sh 等 Bourne 风格 shell:由
- 生效范围:对所有用户生效(除非单独在脚本里判断用户/终端类型)。
- 执行时机:
- 一般在登录时(login shell)执行,比如:TTY 登录、SSH 登录、图形界面中打开第一个终端等。
- 具体还跟你的发行版、终端配置有关(某些终端会让交互式 shell 也加载
/etc/profile)。
简单理解:
/etc/profile.d= 系统管理员为"所有人"统一写的一堆环境设置脚本。
二、你看到的这些文件分别做什么?
不同发行版略有差异,我按常见的 Debian/Ubuntu/Fedora/Manjaro 等系统典型用途来说明。你可以用 cat 文件名 实际看看内容,会更直观。
1. 01-locale-fix.sh
功能:修正或统一系统的语言/本地化设置(locale)
常见内容大概会:
- 设置
LANG、LC_ALL、LC_CTYPE等环境变量; - 修复某些终端/桌面环境下乱码、排序、日期格式等问题;
- 有些发行版用它避免部分程序因不完整的 locale 设置而报错(比如 Perl 的 "Setting locale failed")。
可以看看内容,大概类似:
sh
# 修补 locale 设置,避免出现"locale: Cannot set LC_XXX"之类的警告
[ -z "$LANG" ] && export LANG=en_US.UTF-8
2. apps-bin-path.sh
功能:把一些"应用程序统一安装目录"加到 PATH 里
典型用途:
- 把
/var/lib/snapd/snap/bin、/var/lib/flatpak/exports/bin、~/.local/bin或发行版定义的应用目录加进PATH; - 确保用户安装的桌面应用(比如 via appstream、snap、某些软件中心)可以在命令行直接运行。
内容里一般会看到类似:
sh
# 如果 /var/lib/snapd/snap/bin 存在,就加进 PATH
if [ -d /var/lib/snapd/snap/bin ] ; then
PATH="$PATH:/var/lib/snapd/snap/bin"
fi
export PATH
3. bash_completion.sh
功能:为 bash 启用"智能补全(tab 补全)"
- 加载系统的 bash-completion 框架,一般位于
/etc/bash_completion或/usr/share/bash-completion/bash_completion。 - 让
git、docker、kubectl等命令可以智能补全部分参数、选项、分支名等。
一般逻辑类似:
sh
# 如果是交互式 bash,则加载 bash completion
[ -n "$BASH_VERSION" ] || return
# 避免非交互式 shell 加载
case $- in
*i*) ;;
*) return;;
esac
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
fi
4. cedilla-portuguese.sh
功能:修复/优化葡萄牙语中的"cedilla"(ç)输入问题
主要针对:
- 某些布局/输入法下,打
ç时会因为 locale 或键盘映射问题变成别的符号; - 通过设置
GTK_IM_MODULE、QT_IM_MODULE或某些 XKB 选项来避免 bug。
大致可能包含:
sh
# 避免葡语中 "´c" 之类的组合输入错乱
export GTK_IM_MODULE=cedilla
如果你不是使用葡萄牙语键盘/语言,这个脚本也通常不会有负面影响。
5. flatpak.sh
功能:为 Flatpak 设置环境变量 & PATH
常见作用:
- 把 Flatpak 安装的应用程序所在目录(比如
/var/lib/flatpak/exports/bin、~/.local/share/flatpak/exports/bin)加入 PATH; - 设置
XDG_DATA_DIRS等,保证图形桌面能找到 Flatpak 提供的.desktop文件和图标; - 为某些集成(如 portals)设置必要变量。
例子:
sh
# PATH 中加入 flatpak 导出的 bin
if [ -d /var/lib/flatpak/exports/bin ]; then
PATH="/var/lib/flatpak/exports/bin:$PATH"
fi
# XDG_DATA_DIRS 里加入 flatpak 的数据目录
if [ -d /var/lib/flatpak/exports/share ]; then
XDG_DATA_DIRS="/var/lib/flatpak/exports/share:$XDG_DATA_DIRS"
fi
export PATH XDG_DATA_DIRS
6. gawk.sh 和 gawk.csh
功能:为 GNU awk (gawk) 设置环境变量
gawk 是 GNU 版本的 awk 命令。这两个文件分别针对:
gawk.sh:给 bash/sh/zsh 等 Bourne 系脚本用;gawk.csh:给 csh/tcsh 用。
可能做的事情:
- 设置
AWKPATH(awk 搜索脚本库的路径); - 设置
AWKLIBPATH(gawk 扩展库路径); - 有些发行版用它来告知系统使用
gawk的新功能或兼容性选项。
一个典型(非完全)示例:
sh
# gawk.sh
AWKPATH="/usr/share/awk"
AWKLIBPATH="/usr/lib/gawk"
export AWKPATH AWKLIBPATH
7. im-config_wayland.sh
功能:在 Wayland 会话下设置输入法相关环境变量
-
im-config是用来为 X/Wayland 设置输入法框架的工具(fcitx、ibus 等)。 -
这个脚本针对 Wayland 环境进行特定设置,比如:
XMODIFIERSGTK_IM_MODULEQT_IM_MODULE- 某些 Wayland 变量(如
QT_QPA_PLATFORM)
以便在 Wayland 下中文输入法、日文输入法之类可以正常工作。
例子(伪代码):
sh
# 只在 Wayland session 才设置
[ "$XDG_SESSION_TYPE" = "wayland" ] || return
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"
具体值要看你实际使用的是哪种输入法。
8. modules.sh
功能:为 Environment Modules / Lmod 之类的"模块系统"做初始化
Environment Modules 是在服务器、HPC 集群中常见的一套环境管理工具,通过 module load xxx 来切换不同版本的软件环境(如不同版本的 gcc、mpi 等)。
modules.sh 一般会:
- 把
module命令这个"函数/别名"加载到 shell 中; - 设置
MODULEPATH等环境变量。
示例(简化):
sh
# 初始化 environment modules
if [ -f /usr/share/modules/init/bash ]; then
. /usr/share/modules/init/bash
fi
如果你是桌面用户,可能几乎用不到,但装了相关包就会有。
9. vte-2.91.sh 和 vte.csh
功能:与 GNOME Terminal / VTE 终端部件相关的环境设置
VTE 是 GNOME Terminal、XFCE Terminal 等使用的终端 widget 库。
这些脚本的典型作用:
- 设置
PROMPT_COMMAND或PS1,在提示符中显示工作目录、主机名、颜色等; - 初始化与 VTE 相关的变量(有助于终端记住滚动历史、命令历史等行为);
- 做一些兼容性调整,确保某些终端特性在各种 shell 下表现一致。
vte-2.91.sh 是给 Bash / sh 等用的,vte.csh 是给 csh/tcsh 用的。
你可能会看到类似逻辑:
sh
# 如果在 VTE-based 终端里,设置一套特殊的提示符逻辑
if [ -n "$VTE_VERSION" ]; then
# 用 PROMPT_COMMAND 记录当前目录、命令历史等给终端
__vte_prompt_command() { ... }
PROMPT_COMMAND="__vte_prompt_command; $PROMPT_COMMAND"
fi
10. xdg_dirs_desktop_session.sh
功能:根据桌面会话设置 XDG 系列目录变量
常见变量:
XDG_DATA_DIRSXDG_CONFIG_DIRSXDG_RUNTIME_DIR(通常由 systemd-logind 统一设置)
具体目的:
- 让桌面环境、应用程序知道到哪里去找:
.desktop启动文件;- 图标、主题;
- 全局/系统配置文件;
- 根据当前桌面(GNOME、KDE、Xfce 等)不同做适配。
内容里可能会判断:
sh
# 根据 DESKTOP_SESSION / XDG_CURRENT_DESKTOP 调整 XDG_DATA_DIRS
case "$XDG_CURRENT_DESKTOP" in
GNOME) ... ;;
KDE) ... ;;
XFCE) ... ;;
esac
三、简单总结一下你的问题
-
/etc/profile.d目录是干嘛的?- 专门用来放系统级的环境配置脚本。
- 登录 shell 启动时会自动按顺序执行里面的
.sh文件(以及对应的.csh文件给 csh 用)。
-
里面这些脚本的共同特点:
- 面向"所有用户"生效;
- 不直接是命令,而是在启动时"悄悄帮你做好环境准备",包括:
- 语言与编码(
01-locale-fix.sh) - 程序路径 PATH(
apps-bin-path.sh、flatpak.sh) - 输入法、Wayland 支持(
im-config_wayland.sh) - 命令补全(
bash_completion.sh) - 终端提示符/VTE 集成(
vte-2.91.sh、vte.csh) - 特定软件的环境(
gawk.*、modules.sh、cedilla-portuguese.sh等) - XDG 标准目录(
xdg_dirs_desktop_session.sh)
- 语言与编码(