推荐:这个是我写的一些变量(局部、环境、系统、只读、位置变量) 和 环境变量的一些基础问题,点一下说不定会涨知识~~
Centos 中: ~/.bashrc 、 ~/.bash_profile
Ubuntu 中: ~/.bashrc 、 ~/.profile
只对当前登录系统的用户有效!
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 命令 切换用户 的时候。
系统在加载了其他程序启动之后,这里就到了调用第一个环境变量文件的时候:
非正常登录的时候,是指在 root用户 中 使用 su 命令 切换其他用户,因为 系统在我们登录root用户 的时候,已经加载过一遍 环境变量的配置文件了,所以当你 切换用户登录系统的时候就不用重头重新加载环境变量文件了! 这个时候是这样加载的:
注意:这讲的是跟 Linux登录系统起作用的 环境变量配置文件,在下一章节会讲 跟 Linux登录系统无关的 环境变量的配置文件!
戳我直达下一章节,先看下面的文章也行,文末也有去下一章的链接!
[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
}
.......
[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
[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 这里来将上面的变量全部声明为环境变量!!!"
[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
[root@Centos ~]# umask
0022
第一个0:系统的特殊权限!(SUID、SBIT、SGID)
"022 表示默认权限: 系统打算丢弃的权限( 新建文件或目录的权限 = 文件或目录的最大权限 减 默认权限)"
[root@Centos ~]# touch a.txt
[root@Centos ~]# mkdir a
[root@Centos ~]# ll
- rw- r-- r-- 1 root root 185 3月 23 09:45 a.txt
d rwx r-x r-x 2 root root 6 3月 23 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 默认值为 033 ;
666-033=633? 你会发现在文件里面没有符合权限制为3的,
这时候很简单,你只需要在你的结果的奇数位都上 +1 即可!
eg 666-033=633 转换为:633+011=644!
"注意:" 这里只会调用 以 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
[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
[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
# 注意,每个系统的这里的位置不一样,你可以根据这个脚本中的内容来查看永久定义你系统默认语言的文件路径:
# 我的 /etc/profile.d/lang.sh 文件里面指的路径是: /etc/locale.conf
# so 我就去查看这个文件;你们的路径可能不一样,所以得自己查看那个文件确认路径!
[root@Centos ~]# cat /etc/locale.conf
LANG="zh_CN.UTF-8"
# 如果你对于设置系统语言有哪些地方不了解,可以点击下面这个链接了解一下!
关于系统语言的更多了解请点击此链接
[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 生成环境变量
PATH=$PATH:$HOME/bin
export PATH
# 将自己的家目录下的 "/bin" 目录加入到了环境变量,并且 使用 export 生成环境变量
[root@Centos ~]# vim ~/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# 咱们也说过:这个文件是家目录下,此文件只对当前登录系统的用户生效!
[root@Centos ~]# vim ~/.bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
[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包进行安装!
下一章:跟登录系统无关的环境变量配置文件详解!