bash shell中的环境变量

环境变量——bash shell使用环境变量来存储系统相关数据,并允许将数据存储在内存中。

环境变量分为:全局环境变量

本地环境变量




目录

  • 全局环境变量
  • 本地环境变量
  • 设置全局环境变量
  • 删除环境变量
  • PATH全局环境变量
  • 设置系统环境变量的相关文件(登录、非登录、交互、非交互shell)


一、全局环境变量

在当前shell和子shell都可见

可以用printenv命令查看全局环境变量,大写表示是系统环境变量,小写表示是普通用户的环境变量

这是bash shell的一个标准约定,不是必须的,因此在设置新的环境变量的时候我们用小写就行了,用于区分个人和系统环境变量。

[[email protected] ~]# 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\]\[email protected]\[\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会把它当做一个单独的命令执行

三、设置全局环境变量

使用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环境变量的。

[[email protected] ~]# 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
[[email protected] ~]#

$HOME启动文件,我的系统用的~/.bash_profile,这些文件都是以.开头,代表了都是隐藏文件,同时是针对特定用户的,因此用户可以修改该文件。

我们看下~/.bash_profile文件下的内容定义PATH的那一行。$HOME文件定义特定用户的PATH=$PATH:$HOME/bin,代表我们可以将可执行文件放在$HOME/bin目录下。

[[email protected] 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     # 下面的内容说明

[[email protected] ~]# 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文件内容

[[email protected] ~]# 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脚本的时候,会执行该变量指向的文件。

我们可以利用$-的变量值来查看当前shell是交互式还是非交互式的,如下图:

vim tmp.sh
#!/bin/bash
echo $-

区分交互式和非交互式就是看是否有‘i’(interactive),可以看出脚本中为非交互式,我们平时用的终端为交互式。

6.5 总结

登录式shell,包括依次要执行的启动文件和文件代码部分要调用的文件,对他们概括如下:

非登录式shell

交互式shell

执行启动文件过程类似于非登录式shell

非交互式shell

执行BASH_ENV全局环境变量指向的文件

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



bash shell中的环境变量

原文地址:http://blog.51cto.com/13570193/2089861

时间: 2024-11-05 19:40:11

bash shell中的环境变量的相关文章

shell中的环境变量:local,global,export

 1.local一般用于局部变量声明,多在在函数内部使用.实例如下:      echo_start() { local STR="$1" echo "...... ${STR} ......starting at $(date)" } 2.Shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止. 3.export 将自定义变量设定为系统环境变量(仅限于该次登陆操作,当前shell中有效)    语法:expo

Bash 是如何从环境变量中导入函数的

在上文中曾说到: 所谓的环境变量的真实面目其实就是个任意字符串 Bash 在启动时会将 environ 数组中包含 = 号的字符串导入成为自己的变量 Bash 在启动外部命令时会将自己内部标记为环境变量的变量重组成字符串数组赋值给 environ 本文中继续深入讲三点: environ 数组中可能存在 = 左边名字相同的元素,也就是同名的环境变量,Bash 是怎么导入的? Bash 还可以从环境变量中导入函数,甚至同时导入两个同名的变量和函数 Bash 还可以同时导出两个同名的变量和函数 如果有

Ubuntu中设置环境变量详解

1, 为单一用户:.bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.打开用户主目录下的.bashrc,在这个文件中加入export PATH="$PATH:export PATH="$PATH:/home/***/android-sdk-linux_86 /platform-tools/"使生效 source .bashrc2,全局设置:/etc/profile 是所有用户的环境变量在/etc/profile中增

辛星浅谈Linux中的环境变量

全局变量和本地环境变量: bash  shell使用一种称为环境变量的特性来存储关于shell会话和工作环境的信息,这也是环境变量的名字的由来.该特性还允许我们把数据存储在内存中,以便于在shell中运行的程序或者脚本中访问它们.bash  shell中共有两种类型的环境变量:全局变量和本地变量. 全局环境变量在shell会话和该shell产生的任何子进程中都可见.而本地变量则只在创建它们的shell中可见.在产生需要父进程信息的子进程的应用程序中,这便体现了全局变量的重要作用.系统环境变量使用

Shell学习之环境变量配置文件(三)

Shell学习之环境变量配置文件 目录 环境变量配置文件简介 环境变量配置文件作用 其他配置文件和登录信息 环境变量配置文件简介 环境变量配置文件简介 环境变量配置文件中主要是定义对系统操作环境生效的系统默认环境变量,比如PATH.HISTSZE.PS1.HOSTNAME等默认环境变量. 让配置文件直接生效,不用重新登陆 source命令 source配置文件 .配置文件 有哪些配置文件 /etc/profile /etc/profile.d/*.sh ~/.bash_profile ~/.ba

Shell变量的作用域:Shell全局变量、环境变量和局部变量

Shell 变量的作用域(Scope),就是 Shell 变量的有效范围(可以使用的范围). 在不同的作用域中,同名的变量不会相互干涉,就好像 A 班有个叫小明的同学,B 班也有个叫小明的同学,虽然他们都叫小明(对应于变量名),但是由于所在的班级(对应于作用域)不同,所以不会造成混乱.但是如果同一个班级中有两个叫小明的同学,就必须用类似于“大小明”.“小小明”这样的命名来区分他们. Shell 变量的作用域可以分为三种: 有的变量只能在函数内部使用,这叫做局部变量(local variable)

第十一章、认识与学习 BASH Bash Shell 的操作环境

Bash Shell 的操作环境: 配置值分为系统整体配置值与各人喜好配置值, 仅是一些文件放置的地点不同! 路径与命令搜寻顺序 一个命令 (例如 ls) 被下达时, 到底是哪一个 ls 被拿来运行? 以相对/绝对路径运行命令,例如『 /bin/ls 』或『 ./ls 』: 由 alias 找到该命令来运行: 由 bash 内建的 (builtin) 命令来运行: 透过 $PATH 这个变量的顺序搜寻到的第一个命令来运行. 可以发现ls有颜色但是/bin/ls则没有颜色. 因为 /bin/ls

bash shell 中的比较

1.算术比较 运算符 描述 -eq 等于 -ne 不等于 -gt 大于 -lt 小于 -ge 大于等于 -le 小于等于 举例: [ $var -eq 1 ] #变量等于1 返回真 [ $var -ne 1 ] #变量不等于1 返回真 [ $var -gt 1 ] #变量大于1 返回真 [ $var -lt 1 ] #变量小于1 返回真 [ $var -ge 1 ] #变量大于等于1 返回真 [ $var -le 1 ] #变量小于等于1 返回真 2.字符串比较 字符串比较时候使用[[ ]] 双

Linux中与环境变量相关的函数

1.在终端可以通过env.set命令查看当前的环境变量 2.通过main函数中的第三个参数可以得到当前进程的环境变量列表 int main(int argc , char *argv[] , char *env[]); 其中argv和env是一个指针数组,数组的最后一个元素为NULL 3.打印当前进程的环境变量 int main(int argc , char *argv[] , char *env[]){ char **p = env; while(*p){ printf("%s\n"