通俗易懂的学习 Linux 登录系统时如何加载环境变量?(有图更方便理解)

文章目录

      • 环境变量文件的分类:
        • 1、用户级别文件:
        • 2、系统级别文件:
      • 正常登录系统的时候,环境变量文件的加载过程:
      • 非正常登录系统的时候,环境变量文件的加载过程:
      • 对 系统登录起作用 的环境变量配置文件详解:
        • 1、Centos:/etc/profile
          •   ①、 /etc/profile 文件脚本内容详解:
          •   ②、定义系统查找命令的路径:
          •   ③、根据登录的用户的 UID 来判断是什么用户:
          •   ④、使用 export 命令声明环境变量:
          •   ⑤、定义了 umask 的默认权限:
          •   ⑥、温故知新(umask 命令 详解)
          •   ⑦、调用 /etc/profile.d/*.sh 文件:
        • 2、Centos:/etc/profile.d/*.sh
          •   ①、 /etc/profile.d/ 下 .sh 文件介绍:
          •   ②、/etc/profile.d/lang.sh 详解:
          •   ③、查看 $HOME/.i18n 文件(定义系统的默认语言):
        • 3、Centos:~/.bash_profile(Ubuntu :~/.profile )
          •   ①、文件作用1:调用 ~/.bashrc 文件:
          •   ②、文件作用2:将自己家目录的 /bin 目录加入到环境变量:
        • 4、Centos:~/.bashrc
          •   ①、作用1:定义了 alias 别名!
          •   ②、作用2:调用最后一个环境变量文件 —— /etc/bashrc
        • 5、Centos:/etc/bashrc       (Ubuntu:/etc/bash.bashrc )
          •   ①、定义了 PS1(登录系统命令提示符)
          •   ②、重点:不正常登录系统的配置文件:
      • ★★★ 提一个常见错误!


 

       推荐:这个是我写的一些变量(局部、环境、系统、只读、位置变量) 和 环境变量的一些基础问题,点一下说不定会涨知识~~
 


 

环境变量文件的分类:

 

1、用户级别文件:

Centos 中: ~/.bashrc 、 ~/.bash_profile
Ubuntu 中: ~/.bashrc 、 ~/.profile

只对当前登录系统的用户有效!


2、系统级别文件:

Centos 中:/etc/bashrc          、/etc/profile 、/etc/environment、/etc/profile.d/*.sh
Ubuntu 中:/etc/bash.bashrc 、/etc/profile 、/etc/environment、/etc/profile.d/*.sh

对所有用户都生效!
 

        这里具体的使用方法 和 他们的差别在上篇文章中有记录! 戳我去学习!不要嫌麻烦!


 

正常登录系统的时候,环境变量文件的加载过程:

        特别注意: 什么是正常登录的时候,什么时候是不正常的呢?

正常 就是直接输入username+password ,login 的时候;
不正常 就是当我们 在root用户中 使用 su 命令 切换用户 的时候。

系统在加载了其他程序启动之后,这里就到了调用第一个环境变量文件的时候:
通俗易懂的学习 Linux 登录系统时如何加载环境变量?(有图更方便理解)_第1张图片
 


 

非正常登录系统的时候,环境变量文件的加载过程:

 
       非正常登录的时候,是指在 root用户 中 使用 su 命令 切换其他用户,因为 系统在我们登录root用户 的时候,已经加载过一遍 环境变量的配置文件了,所以当你 切换用户登录系统的时候就不用重头重新加载环境变量文件了! 这个时候是这样加载的:
通俗易懂的学习 Linux 登录系统时如何加载环境变量?(有图更方便理解)_第2张图片
 


 

对 系统登录起作用 的环境变量配置文件详解:

       注意:这讲的是跟 Linux登录系统起作用的 环境变量配置文件,在下一章节会讲 跟 Linux登录系统无关的 环境变量的配置文件

戳我直达下一章节,先看下面的文章也行,文末也有去下一章的链接!

1、Centos:/etc/profile

  ①、 /etc/profile 文件脚本内容详解:
[root @ Centos ~]# vim /etc/profile

#/etc/profile

"# System wide environment and startup programs, for login setup"
#系统范围的环境和启动程序,用于登录设置
"# Functions and aliases go in /etc/bashrc"
#函数和别名进入/ etc / bashrc

"# It's NOT a good idea to change this file unless you know what you"
#除非知道自己的内容,否则更改此文件不是一个好主意
"# are doing. It's much better to create a custom.sh shell script in"
# 是这样。 最好在其中创建一个custom.sh shell脚本
"# /etc/profile.d/ to make custom changes to your environment, as this"/etc/profile.d/可以对您的环境进行自定义更改,如下所示
  ②、定义系统查找命令的路径:
[root @ Centos ~]# vim /etc/profile
pathmunge () {
    case ":${PATH}:" in
        *:"$1":*)
            ;;
        *)
            if [ "$2" = "after" ] ; then
                PATH=$PATH:$1
            else
                PATH=$1:$PATH
            fi
    esac
}
.......
  ③、根据登录的用户的 UID 来判断是什么用户:
[root@Centos ~]# vim /etc/profile
if [ -x /usr/bin/id ]; then
    if [ -z "$EUID" ]; then
        # ksh workaround
        EUID=`/usr/bin/id -u`
        UID=`/usr/bin/id -ru`
    fi
    USER="`/usr/bin/id -un`"
    LOGNAME=$USER
    MAIL="/var/spool/mail/$USER"
fi


# Path manipulation             —— # 路径操作       
if [ "$EUID" = "0" ]; then
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin   —— # 如果是管理员用户,则path这些路径,反之path下面的路径
else
    pathmunge /usr/local/sbin after
    pathmunge /usr/sbin after
fi
  ④、使用 export 命令声明环境变量:
[root@Centos ~]# vim /etc/profile
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000    # 定义历史命令条数,你使用 history 命令可以查看历史命令!

if [ "$HISTCONTROL" = "ignorespace" ] ; then
    export HISTCONTROL=ignoreboth
else
    export HISTCONTROL=ignoredups
fi

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
"export 这里来将上面的变量全部声明为环境变量!!!"
  ⑤、定义了 umask 的默认权限:
[root@Centos ~]# vim /etc/profile

"By default, we want umask to get set. This sets it for login shell"
# 默认情况下,我们希望设置umask。 这将其设置为登录外壳
"Current threshold for system reserved uid/gids is 200"
# 系统保留的uid / gids的当前阈值为200
"You could check uidgid reservation validity in"
# 您可以在中检查uidgid保留的有效性
"/usr/share/doc/setup-*/uidgid "
# 你出去可以 cat 这个文件具体指的什么内容!"


if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    umask 002
else
    umask 022
fi
  ⑥、温故知新(umask 命令 详解)
[root@Centos ~]# umask 
0022

第一个0:系统的特殊权限!(SUIDSBITSGID"022 表示默认权限: 系统打算丢弃的权限( 新建文件或目录的权限 = 文件或目录的最大权限 减 默认权限)"

[root@Centos ~]# touch a.txt 
[root@Centos ~]# mkdir a
[root@Centos ~]# ll 
- rw- r-- r--  1 root root  185 323 09:45 a.txt
d rwx r-x r-x  2 root root    6 323 09:49 a

r —— 读权限,对应数字 4;   第一个rwx:"文件所有者的权限"为:可读可写。
w —— 写权限,对应数字 2;   第二个r--:与文件所有者"在同一个用户组"的用户的权限是:可读。
x —— 执行权限;对应数字 1;  第三个r--:与文件所有者"不在同一个用户组"的用户的权限是:可读。

看上面的结果你会发现:明明是一样的默认权限,但是创出的文件和目录的权限却是不一样的,这是因为:
"文件的最高权限为 666 ,然而目录的最高权限为 777"

# 创建的文件默认最高只有读写权限,没有执行权限!得管理员手动赋予执行权限!
# 不然你一创建的文件就可以执行,对于系统来说多么的不安全,所以系统默认就只给文件读写权限!
# chmod +x filename 赋予执行权限;
  chmod -x filename 取消执行权限
# 对于目录来说,执行权限就是 “cd 目录”,这样系统当然默认给执行权限了!

" ★★★ 注意:"
# 问:那文件默认创建出来的是 “644” 呢?
# 答:肯定是 最高权限"666" 减 默认权限"022" = 新建文件权限"644"!
其实这样的回答是不严谨的,因为 "权限不能使用数字进行换算,必须使用字母!"
eg:文件最大权限: "rw- rw- rw-"
   umask 默认值: "--- -w- -w-
这样一减: 新建文件的权限 = "rw- r-- r--" (644)

如果你设置了其他的默认权限,发现用数字减去以后为奇数,并不存在,那么怎么办?
eg:你设置 umask 默认值为 033666-033=633? 你会发现在文件里面没有符合权限制为3的,
这时候很简单,你只需要在你的结果的奇数位都上 +1 即可!
eg 666-033=633 转换为:633+011=644
  ⑦、调用 /etc/profile.d/*.sh 文件:
"注意:"  这里只会调用 以 sh 结尾的文件!

[root@Centos ~]# vim /etc/profile

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

 


 

2、Centos:/etc/profile.d/*.sh

  ①、 /etc/profile.d/ 下 .sh 文件介绍:
[root@Centos ~]# ls /etc/profile.d/*.sh | awk -F"/" '{print $NF}'
256term.sh   colorgrep.sh   colorls.sh    lang.sh  
less.sh      vim.sh         which2.sh
  ②、/etc/profile.d/lang.sh 详解:
[root@Centos ~]# vim /etc/profile.d/lang.sh 
  1 # /etc/profile.d/lang.sh - set i18n stuff
    ......
 11     for langfile in /etc/locale.conf "$HOME/.i18n" ; do
 
 # 最重要的是这里的:"for langfile in /etc/locale.conf $HOME/.I18N" 调用这个文件!
 :set nu
 
# 注意,每个系统的这里的位置不一样,你可以根据这个脚本中的内容来查看永久定义你系统默认语言的文件路径:
  ③、查看 $HOME/.i18n 文件(定义系统的默认语言):
# 我的 /etc/profile.d/lang.sh 文件里面指的路径是: /etc/locale.conf

# so 我就去查看这个文件;你们的路径可能不一样,所以得自己查看那个文件确认路径!

[root@Centos ~]# cat /etc/locale.conf 
LANG="zh_CN.UTF-8"

# 如果你对于设置系统语言有哪些地方不了解,可以点击下面这个链接了解一下!

关于系统语言的更多了解请点击此链接
 


 

3、Centos:~/.bash_profile(Ubuntu :~/.profile )

  ①、文件作用1:调用 ~/.bashrc 文件:
[root@Centos ~]# vim ~/.bash_profile
if [ -f ~/.bashrc ]; then   
        . ~/.bashrc      # 判断这个文件是否存在,if 存在 则调用该文件!
fi

# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH 

#该文件的作用就是为调用 ~/.bashrc 文件做准备!
# 然后将自己的家目录下的 "/bin" 目录加入到了环境变量,并且 使用 export 生成环境变量
  ②、文件作用2:将自己家目录的 /bin 目录加入到环境变量:
PATH=$PATH:$HOME/bin
export PATH 

# 将自己的家目录下的 "/bin" 目录加入到了环境变量,并且 使用 export 生成环境变量

 


 

4、Centos:~/.bashrc

  ①、作用1:定义了 alias 别名!
[root@Centos ~]# vim ~/.bashrc 
# .bashrc
# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# 咱们也说过:这个文件是家目录下,此文件只对当前登录系统的用户生效!
  ②、作用2:调用最后一个环境变量文件 —— /etc/bashrc
[root@Centos ~]# vim ~/.bashrc 
# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

 


 

5、Centos:/etc/bashrc       (Ubuntu:/etc/bash.bashrc )

  ①、定义了 PS1(登录系统命令提示符)
[root@Centos ~]# vim /etc/bashrc 
if [ "$PS1" ]; then
  if [ -z "$PROMPT_COMMAND" ]; then
    case $TERM in
    xterm*|vte*)
      if [ -e /etc/sysconfig/bash-prompt-xterm ]; then
          PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm
      elif [ "${VTE_VERSION:-0}" -ge 3405 ]; then
          PROMPT_COMMAND="__vte_prompt_command"
      else
          PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
      fi
      ;;
......

下面还有很多配置文件,但是你细看,会发现那些配置文件在你"正常登录系统"的时候并"不生效"!
只在"非正常登录系统的时候才生效"!
正常登录:   输入 username + password 登录系统:
非正常登录: 在 root 用户上 使用 su 命令切换到其他用户的时候!

# 关于正常登录 和 非正常登录 “Linux 加载环境变量文件的” 的详细图解在文章开头有介绍!
  ②、重点:不正常登录系统的配置文件:

        你会发现,这个文件里面也有一些其他的配置(eg:PATH、umask、PS1、调用 /etc/profile.d/*.sh 文件)

重点在于脚本中的注释消息: 它自己多次声明了 "not a login shell" !

[root@Centos ~]# vim /etc/bashrc 

# 关于非正常登录系统的时候,PATH 的定义!

 51  if ! shopt -q login_shell ; then    重要注释★ # We're not a login shell
 53     pathmunge () {
 54         case ":${PATH}:" in
 55             *:"$1":*)
 56                 ;;
 57             *)
 58                 if [ "$2" = "after" ] ; then
 59                     PATH=$PATH:$1
 60                 else
 61                     PATH=$1:$PATH
 62                 fi
 63         esac
 64     }

重要注释★:# 关于非正常登录系统的时候,umask 的定义!
 66     # By default, we want umask to get set. "This sets it for non-login shell."
 
 70     if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
 71        umask 002
 72     else
 73        umask 022
 74     fi


重要注释★:# 关于非正常登录系统的时候,PS1命令提示符 及 调用 "/etc/profile.d/*.sh" 文件
 77     # Only display echos from profile.d scripts "if we are no login shell"

 79     for i in /etc/profile.d/*.sh; do
 80         if [ -r "$i" ]; then
 81             if [ "$PS1" ]; then
 82                 . "$i"
 83             else
 84                 . "$i" >/dev/null
 85             fi
 86         fi
 87     done

 


   

★★★ 提一个常见错误!

正常登录系统的时候,提示符是这样的: [root@Centos ~]# 
如果你出现这样的(单用户模式才会出现的情况:)  bash5.1 #

那就说明你的那个环境变量文件出问题了,可能是 "/etc/profile  、 ~/.bash_profile 、 ~/.bashrc 、 /etc/bashrc"
四个文件缺一不可,如果有一个有问题,那么就不会出现正常的命令提示符;
反之,起作用的就是Linux开机之后 Linux内核自带默认的提示符。

解决办法:你可以跟别的机子选择 scp 复制过来,或者自己找到那些文件所在的rpm包进行安装!

下一章:跟登录系统无关的环境变量配置文件详解!

你可能感兴趣的:(shell,shell,编程语言)