Fork me on GitHub

这里有个小知识点
在 Linux 系统中,用户环境变量文件是用来设置用户级别的环境变量和 shell 配置的文件。这些文件可以控制用户的环境,包括路径、命令别名、shell 提示符、自定义函数等。不同的文件在不同的情况下会被加载,并对用户的 shell 会话产生影响。

常见的用户环境变量文件及其作用

  1. /etc/profile

    • 作用: 这是系统范围内的环境变量配置文件,对所有用户生效。当用户登录时(通过交互式的登录 shell,如通过 SSH 登录),系统会首先执行 /etc/profile 中的配置。
    • 加载时机: 每次用户登录时,系统会自动加载 /etc/profile
  2. ~/.profile

    • 作用: 这是每个用户的个人环境变量文件,用于设置用户级别的环境变量。当用户登录时,系统会执行这个文件。可以用来定义用户专属的路径、变量等。
    • 加载时机: 每次用户登录时,系统会自动加载 ~/.profile。对于一些 shell,如 bash,如果没有找到 ~/.bash_profile~/.bash_login,它会执行 ~/.profile
  3. ~/.bash_profile

    • 作用: 这是专门为 bash shell 准备的登录脚本文件。在用户通过交互式登录 shell(如 SSH 登录)时,bash shell 会读取并执行该文件。它通常用于设置环境变量和启动应用程序。
    • 加载时机: 每次用户登录时,bash 会优先加载 ~/.bash_profile,除非指定不加载。~/.bash_profile 通常会包含对 ~/.bashrc 的加载命令。
  4. ~/.bashrc

    • 作用: 这是专门为 bash shell 准备的非登录交互式 shell 初始化文件。它主要用于设置命令别名、函数、shell 提示符、环境变量等配置。在启动一个新的终端或运行一个新的 bash shell 时,会加载这个文件。
    • 加载时机: 每次启动非登录的交互式 shell(如打开一个新的终端窗口)时,bash 会加载 ~/.bashrc
  5. /etc/bash.bashrc

    • 作用: 这是系统范围内的 bash 初始化文件,对所有用户生效。用于在所有用户的非登录交互式 shell 中设置环境变量和其他配置。
    • 加载时机: 每次启动非登录的交互式 shell 时(如打开终端窗口),系统会加载 /etc/bash.bashrc
  6. ~/.bash_logout

    • 作用: 这是 bash shell 在用户注销时执行的文件。可以用来清理临时文件、记录日志等。
    • 加载时机: 每次用户从登录 shell 注销时,bash 会执行 ~/.bash_logout

加载顺序和优先级

  • 登录 shell(如 SSH 登录)时,系统会按照以下顺序加载:

    1. /etc/profile
    2. ~/.bash_profile~/.bash_login~/.profile
    3. ~/.bashrc(通常是通过 ~/.bash_profile 或其他文件手动加载的)
  • 非登录交互式 shell(如打开新的终端)时,系统会加载:

    1. /etc/bash.bashrc
    2. ~/.bashrc

总结

用户环境变量文件在 Linux 系统中起到了配置和定制用户环境的关键作用。通过这些文件,用户可以自定义自己的工作环境,包括添加自定义命令、设置路径和配置 shell 行为。了解这些文件的作用和加载顺序对于有效管理和优化 Linux 工作环境非常重要。

使用lineinfile模块设置环境变量

---
  - hosts: ubuntu
    tasks:
    - name: 设置环境变量
      lineinfile:
          dest: ~/.profile
          regexp: ^export ENV_KEY=
          line: export ENV_KEY=env_value
    - name: 获取环境变量值 #指定bash shell,默认是使用/bin/sh,/bin/sh无法执行source命令
      ansible.builtin.shell: 'source ~/.profile && echo $ENV_KEY'
      args:
        executable: /bin/bash
      register: env_key

    - name: 打印环境变量,inventory_hostname 是当前主机在inventory清单文件中的名称,默认情况下会在playbook中显示出来,一般为ip,也可以自定义名称
      debug:
        msg: "this linux os {{ inventory_hostname }} env_key is {{ env_key.stdout }}"
    - name: 打印环境变量 #ansible_env 变量不包含lineinfile模块设置的变量,不知道为什么
      debug:
        msg: "{{ ansible_env }}"
root@test:~/ansible/env# ansible-playbook env01.yaml  

PLAY [ubuntu] *************************************************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************************************************************************************************************
ok: [192.168.232.100]

TASK [设置环境变量] *******************************************************************************************************************************************************************************************************************************************************
ok: [192.168.232.100]

TASK [获取环境变量值] *****************************************************************************************************************************************************************************************************************************************************
changed: [192.168.232.100]

TASK [打印环境变量] *******************************************************************************************************************************************************************************************************************************************************
ok: [192.168.232.100] => {
    "msg": "this linux os 192.168.232.100 env_key is env_value"
}

TASK [打印环境变量] *******************************************************************************************************************************************************************************************************************************************************
ok: [192.168.232.100] => {
    "msg": {
        "DBUS_SESSION_BUS_ADDRESS": "unix:path=/run/user/0/bus",
        "HOME": "/root",
        "LANG": "en_US.UTF-8",
        "LOGNAME": "root",
        "PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin",
        "PWD": "/root",
        "SHELL": "/bin/bash",
        "SHLVL": "0",
        "SSH_CLIENT": "192.168.232.100 43140 22",
        "SSH_CONNECTION": "192.168.232.100 43140 192.168.232.100 22",
        "SSH_TTY": "/dev/pts/3",
        "TERM": "xterm",
        "USER": "root",
        "XDG_RUNTIME_DIR": "/run/user/0",
        "XDG_SESSION_CLASS": "user",
        "XDG_SESSION_ID": "39",
        "XDG_SESSION_TYPE": "tty",
        "_": "/bin/sh"
    }
}

PLAY RECAP ****************************************************************************************************************************************************************************************************************************************************************
192.168.232.100            : ok=5    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

posted on 2024-08-13 23:13  anyux  阅读(220)  评论(0)    收藏  举报