设为首页 收藏本站
查看: 924|回复: 0

bash shell中的环境变量

[复制链接]

尚未签到

发表于 2018-8-18 11:54:27 | 显示全部楼层 |阅读模式
  环境变量——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中可见
  可以通过set命令查看,不过set命令查看的是所有环境变量(全局和本地)
  注意在设置环境变量的时候,[变量=值]之间不能添加空格,要不然shell会把它当做一个单独的命令执行
DSC0000.jpg

  三、设置全局环境变量
  使用export命令将本地环境变量变为全局环境变量
DSC0001.jpg

  四、删除环境变量
  使用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。
DSC0002.jpg

  我们可以通过$0变量值来查看是登录式shell还是非登录式shell,登录式shell会在前面显示‘-’非登录式shell则没有
DSC0003.jpg

  在非登录式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
  我们通过终端登录Linux,输入命令,shell执行命令并实时返回结果,退出。这种模式就是交互式shell。
  在交互式shell下,bash不会执行/etc/profile文件,代替而之的是$HOME/.bashrc文件,执行的启动文件和非登录式shell一样。
  这个文件定义新交互式shell的环境变量,该文件最好不要定义全局环境变量(export),另外该文件也会执行/etc/profile.d/*.sh来设定特定应用程序的环境变量。任何开启交互式子shell(bash、su - user)的操作都会读取$HOME/.bashrc。
  6.4 非交互式shell
  和交互式shell相反,该模式下shell不与终端进行交互,例如以shell脚本的方式读取脚本中命令,而不需要与终端交互(除非需要用户输入参数的命令),当文件结束时,该shell也就退出了。
  非交互式shell的相关启动文件和系统设置的一个全局环境变量BASH_ENV相关。该变量默认情况下没有定义。我们需要手动设置该变量,当执行shell脚本的时候,会执行该变量指向的文件。
DSC0004.jpg

DSC0005.jpg

DSC0006.jpg

  我们可以利用$-的变量值来查看当前shell是交互式还是非交互式的,如下图:
vim tmp.sh  
#!/bin/bash
  
echo $-
DSC0007.jpg

  区分交互式和非交互式就是看是否有‘i’(interactive),可以看出脚本中为非交互式,我们平时用的终端为交互式。
  6.5 总结
  登录式shell,包括依次要执行的启动文件和文件代码部分要调用的文件,对他们概括如下:
DSC0008.jpg

  非登录式shell
DSC0009.jpg

  交互式shell
  执行启动文件过程类似于非登录式shell
  非交互式shell
  执行BASH_ENV全局环境变量指向的文件
  知道了这些启动文件的区别后,我们可以针对性的修改启动文件以使自定义的全局环境变量、别名等永久生效,例如我们可以将所有自定义的全局环境变量放在一个.sh结尾的文件中,然后将该文件放到/etc/profile.d/目录下或者将自定义的变量放入/etc/bashrc文件中,这样将对所有的用户都生效。而对于一些针对个人用户的别名等,可以将其写入到~/.bashrc文件中,只对单个用户有效。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-553414-1-1.html 上篇帖子: Shell项目-分发系统-expect(上) 下篇帖子: linux shell学习笔记(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表