linuxshell获取环境变量,bashshell中的环境变量
环境变量——bash shell使⽤环境变量来存储系统相关数据,并允许将数据存储在内存中。
环境变量分为:全局环境变量
本地环境变量
⽬录全局环境变量
本地环境变量
设置全局环境变量
删除环境变量
PATH全局环境变量
设置系统环境变量的相关⽂件(登录、⾮登录、交互、⾮交互shell)
⼀、全局环境变量
在当前shell和⼦shell都可见
可以⽤printenv命令查看全局环境变量,⼤写表⽰是系统环境变量,⼩写表⽰是普通⽤户的环境变量
这是bash shell的⼀个标准约定,不是必须的,因此在设置新的环境变量的时候我们⽤⼩写就⾏了,⽤于区分个⼈和系统环境变量。[root@CentOS6 ~]# printenv
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=172.18.251.124 8132 22
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
SSH_TTY=/dev/pts/4
name=hello        # ⾃⼰定义的环境变量
USER=root
LS_COLORS=...
MAIL=/var/spool/mail/root
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=en_US.UTF-8
PS1=[\[\e[33m\]\u@\[\e[34m\]\h \[\e[m\]\W]\$ \[\e[m\]
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
HISTCONTROL=ignoredups
PS2=\[\e[34m\]> \[\e[m\]
SHLVL=1
HOME=/root
LOGNAME=root
QTLIB=/usr/lib64/qt-3.3/lib
CVS_RSH=ssh
SSH_CONNECTION=172.18.251.124 8132 172.18.250.183 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
DISPLAY=localhost:12.0
G_BROKEN_FILENAMES=1
_=/usr/bin/printenv
⼤部分变量都是在登录主shell时设置的
⼆、本地环境变量
shell界面只在当前shell中可见
可以通过set命令查看,不过set命令查看的是所有环境变量(全局和本地)
注意在设置环境变量的时候,[变量=值]之间不能添加空格,要不然shell会把它当做⼀个单独的命令执⾏
三、设置全局环境变量
使⽤export命令将本地环境变量变为全局环境变量
四、删除环境变量
使⽤unset命令可以删除环境变量,格式为
unset 变量名
不过对于全局环境变量的删除,我们要注意:
如果在⼦shell下删除全局环境变量,删除操作只对⼦shell有效,如果回到⽗shell下,该全局变量还能引⽤五、PATH全局环境变量
修改PATH环境变量:
PATH=$PATH:新加⽬录
⼩技巧:
我们可以将PATH设置为PATH=$PATH:.(单个点代表当前⼯作⽬录)
六、设置系统环境变量的相关⽂件
系统环境变量是在shell启动过程中执⾏相关的⽂件定义的。这些⽂件被称为shell启动⽂件。不过我们在设置系统环境变量的时候,我们要区分登录式shell、⾮登录式shell、交互式shell、⾮交互式shell的区别,(登录/⾮登录和交互/⾮交互只是划分的标准不⼀样)只有弄清除了不同模式的shell才能正确修改相应的shell启动⽂件以⾄于能够正确设置系统环境变量。
正好最近也在接触Linux系统启动流程,这也会涉及到登录⼀个shell的过程。
6.1 登录式shell
登录式shell是⽤户需要输⼊⽤户名和密码的shell,该模式的shell启动过程中会依次执⾏下列⽂件,
/etc/profile    # 登录bash shell的默认主启动⽂件。任何⽤户登录shell都会执⾏此启动⽂件。不建议修改
~/.bash_profile
~/.bash_login
~/.profile      # 上诉这三个$HOME启动⽂件是定义对应⽤户的环境变量。不同linux发⾏版使⽤的⽂件不同
/etc/profile中的命令和脚本不是我们现在关注的,我们主要来看看export那⼀⾏,因此我们可以知道该⽂件是设置系统全局环境变量
/etc/profile另⼀个重要的功能就是能够重复执⾏/etc/profile.d/⽬录下的⽂件(⼤多是.sh和.csh结尾的⽂件),这些⽂件⼤概是特定应⽤程序的启动⽂件,能够设置相关应⽤程序的环境变量,例如/etc/profile.d/lang.*sh 就是⽤来设置LANG环境变量的。
[root@CentOS6 ~]# cat /etc/profile
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /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
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
...
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
...
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
unset i
unset -f pathmunge
[root@CentOS6 ~]#
$HOME启动⽂件,我的系统⽤的~/.bash_profile,这些⽂件都是以.开头,代表了都是隐藏⽂件,同时是针对特定⽤户的,因此⽤户可以修改该⽂件。
我们看下~/.bash_profile⽂件下的内容定义PATH的那⼀⾏。$HOME⽂件定义特定⽤户的PATH=$PATH:$HOME/bin,代表我们可以将可执⾏⽂件放在$HOME/bin⽬录下。
[root@CentOS6 profile.d]# cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
6.2 ⾮登录式shell
登录式shell是需要输⼊⽤户名、密码登录的shell,⽽⾮登录式shell则是不需要的,例如直接在命令⾏输⼊bash、在图形化界⾯点击open in terminal开启命令⾏终端等都是⾮登录式shell。
另外,对于退出shell的命令exit和logout的区别,exit命令可以退出登录式shell和⾮登录式shell,logout只能退出登录式shell。
我们可以通过$0变量值来查看是登录式shell还是⾮登录式shell,登录式shell会在前⾯显⽰‘-’⾮登录式shell则没有
在⾮登录式shell的启动过程中,由于不需要重复的登录shell,所以⾮登录shell只需要执⾏下列⽂件即可,
$HOME/.bashrc    # 下⾯的内容说明
[root@CentOS6 ~]# cat ~/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias cdnet='cd /etc/sysconfig/network-scripts/'
alias ping='ping -c 4'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
该$HOME/.bashrc可以定义⽤户⾃定义的别名和函数,另外还有引⽤公共/etc/bashrc下的变量,我们来看看/etc/bashrc⽂件内容[root@CentOS6 ~]# cat /etc/bashrc
# /etc/bashrc
# System wide functions and aliases
# Environment stuff goes in /etc/profile
# 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
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
# are we an interactive shell?
...
# Only display echos from profile.d scripts if we are no login shell
# and interactive - otherwise just process them to set envvars
for i in /etc/profile.d/*.sh; do
if [ -r "$i" ]; then
if [ "$PS1" ]; then
.
"$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
unset i
unset pathmunge
fi
# vim:ts=4:sw=4
另外该⽂件也会执⾏/etc/profile.d/*.sh来设定特定应⽤程序的环境变量。
其实登录式shell也会执⾏$HOME/.bashrc,可以回到上⾯的~/.bash_profile的代码部分,我们会发现该⽂件中会调⽤$HOME/.bashrc ⽂件。这样说可以加深登录式shell和⾮登录式shell的本质区别。
6.3 交互式shell

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。