linux /etc/profile.d 目录介绍

一、/etc/profile.d 这个目录是干什么的?

  • 作用:放系统级的 shell 启动脚本 (主要是 .sh.csh 等),在用户登录时自动执行,用来统一设置环境变量、路径、别名等。
  • 被谁执行:
    • 对 bash、sh 等 Bourne 风格 shell:由 /etc/profile 这个"总入口"脚本来调用这个目录下所有 *.sh 文件。
    • 对 csh、tcsh 等 C shell:类似逻辑,用 /etc/csh.cshrc/etc/csh.login 去调用 *.csh 文件。
  • 生效范围:对所有用户生效(除非单独在脚本里判断用户/终端类型)。
  • 执行时机:
    • 一般在登录时(login shell)执行,比如:TTY 登录、SSH 登录、图形界面中打开第一个终端等。
    • 具体还跟你的发行版、终端配置有关(某些终端会让交互式 shell 也加载 /etc/profile)。

简单理解:

/etc/profile.d = 系统管理员为"所有人"统一写的一堆环境设置脚本。


二、你看到的这些文件分别做什么?

不同发行版略有差异,我按常见的 Debian/Ubuntu/Fedora/Manjaro 等系统典型用途来说明。你可以用 cat 文件名 实际看看内容,会更直观。


1. 01-locale-fix.sh

功能:修正或统一系统的语言/本地化设置(locale)

常见内容大概会:

  • 设置 LANGLC_ALLLC_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
  • gitdockerkubectl 等命令可以智能补全部分参数、选项、分支名等。

一般逻辑类似:

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_MODULEQT_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.shgawk.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 环境进行特定设置,比如:

    • XMODIFIERS
    • GTK_IM_MODULE
    • QT_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.shvte.csh

功能:与 GNOME Terminal / VTE 终端部件相关的环境设置

VTE 是 GNOME Terminal、XFCE Terminal 等使用的终端 widget 库。

这些脚本的典型作用:

  • 设置 PROMPT_COMMANDPS1,在提示符中显示工作目录、主机名、颜色等;
  • 初始化与 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_DIRS
  • XDG_CONFIG_DIRS
  • XDG_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

三、简单总结一下你的问题

  1. /etc/profile.d 目录是干嘛的?

    • 专门用来放系统级的环境配置脚本。
    • 登录 shell 启动时会自动按顺序执行里面的 .sh 文件(以及对应的 .csh 文件给 csh 用)。
  2. 里面这些脚本的共同特点:

    • 面向"所有用户"生效;
    • 不直接是命令,而是在启动时"悄悄帮你做好环境准备",包括:
      • 语言与编码(01-locale-fix.sh
      • 程序路径 PATH(apps-bin-path.shflatpak.sh
      • 输入法、Wayland 支持(im-config_wayland.sh
      • 命令补全(bash_completion.sh
      • 终端提示符/VTE 集成(vte-2.91.shvte.csh
      • 特定软件的环境(gawk.*modules.shcedilla-portuguese.sh 等)
      • XDG 标准目录(xdg_dirs_desktop_session.sh

相关推荐
0思必得02 小时前
[Web自动化] JavaScriptAJAX与Fetch API
运维·前端·javascript·python·自动化·html·web自动化
梁萌2 小时前
Jenkins构建的触发方式
运维·svn·gitlab·jenkins·webhook·job触发方式·自动触发构建
NotStrandedYet2 小时前
CentOS停更后的新选择:图文详解安装6.x内核openEuler+GNOME图形桌面
linux·运维·信创·国产化·openeuler·国产操作系统
山上三树2 小时前
codedump
linux·服务器
码农老起2 小时前
OceanBase性能调优分享:混合工作负载下的脚本自动化调优与深度分析
运维·自动化·oceanbase
boligongzhu2 小时前
ubuntu22.04 安装Docker Engine和Compose
linux·ubuntu·docker·容器
liuyunshengsir2 小时前
huggingface-cli download 断点续传
linux·hugging face·魔塔社区
小码吃趴菜2 小时前
信号与管道
linux
尘下吹霜2 小时前
【记录】Nginx日志过大导致服务器空间爆满
服务器·网络·nginx