Linux中shell环境变量设置说明

1、查看环境变量

环境变量的名称比较固定,它的值一般由系统自行维护, 并会随着用户状态的改变而改变。每个用户的环境变量都不相同,用户可以通过读取环境变量来了解自己的当前状态。
通过执行 env 命令或 export 命令,可以查看系统中所有的环境变量。 下面列举了其中些较常用的环境变量,我们有必要了解这些变量的用途,以便在管理和维护系统时使用。

[root@mysqldb ~]# env | grep "PATH"
    PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/mysql/app/mysql/bin:/root/bin
    QT_PLUGIN_PATH=/usr/lib64/kde4/plugins:/usr/lib/kde4/plugins
[root@mysqldb ~]# export | grep "HOME"
declare -x HOME="/root"
    •    HOME: 当前用户的家目录。
    •    PATH :当前用户的命令搜索路径。
    •    USER: 当前用户的登录名称。
    •    UID: 当前用户的 UlD。
    •    SHELL: 当前用户使用的 Shell。
    •    PWD:用户当前的工作目录。
    •    LANG: Shell 使用的默认语言。
    •    HISTSIZE: 当前用户的历史命令条数。

可以一次性查看多个环境变量,并使其按照要求的格式显示。例如, 以冒号分隔,显示当前用户的用户名、 家目录以及所使用的Shell。

[root@mysqldb ~]# echo "$USER;$HOME:$SHELL"
        root;/root:/bin/bash

2、自定义环境变量

对于用户自定义的变量,默认情况下只能在当前的Shell环境中使用,因此称为本地变量。 本地变量在新开启的Shell环境以及自己的子Shell中都是无效的。
如果想定义一个在所有终端中都可以使用的变量,那么需要把这个变量定义成环境变量。也就是说,除系统中预先设置好的环境变量之外,用户也可以根据需要来定义新的环境变量。
定义环境变量需要使用export命令,例如将NAME定义为环境变量。这里为了与环境变量的命名风格保持一致,变量名称将全部采用大写字母表示。将NAME定义为环境变量之后, 在当前Shell的子Shell中就可以直接使用这个变量了。

[root@mysqldb ~]# export NAME="teacher"
        [root@mysqldb ~]# echo $NAME
        teacher

如果要撤销我们所自定义的环境变量,那么可以使用unset命令。例如,撤销自定义环境变量NAME。unset命令同样也可以用于撤销用户自定义变量。

[root@mysqldb ~]# unset NAME        

通过刚才这种方式所定义的环境变量, 其作用范围也仅限于当前 Shell及其子Shell,如果我们切换到另一个终端,仍然无法使用当前设置的变量。而且,即使在当前Shell中切换到另一个用户的身份,也是无法使用这个自定义的环境变量的。另外,通过这种方式定义的环境变量是临时性的, 当用户退出登录或者系统重启之后, 自定义的变量都会失效。
如何才能定义一个对于所有终端或者所有用户永久有效的环境变量呢?这就需要修改Bash的配置文件。

3、Bash 配置文件
Bash与我们使用的Linux中的其他大多数程序一样, 也有自己的配置文件, 系统环境变量就是通过这些Bash配置文件来定义的。当我们设置或改变环境变量时,只对当前Shell 环境有效, 如果要自定义永久有效的环境变量, 或者永久更改某个环境变量的值, 则需要修改Bash配置文件。
相对于其他程序,Bash配置文件要稍微复杂一些。Bash的配置文件不止一个,而是由多个分散在系统不同位置的配置文件组成,当用户登录Shell时,就会自动读取并执行这些配置文件中的相关设置。Bash配置文件从总体上分为以下两大类:
• profile类文件:这类文件只在用户登录时执行一次。
• bashrc类文件:这类文件不但在用户登录时会执行,而且每当用户打开新的 Shell 或者创建子Shell时也会执行, 也就是说,bashrc类文件会反复执行多次。

无论是profile类文件还是bashrc类文件,都可以细分为全局配置和局部配置两个类别,这样Bash配置文件就又被细分为以下4种类别。
• profile类的全局配置文件: /etc/profile、/etc/profile.d/*.sh (目录中所有以“.sh”结尾的文件)。
• profile类的局部配置文件:~/.bash_profile
• bashrc类的全局配置文件:/etc/bashrc。
• bashrc类的局部配置文件:~/.basbrc。

全局配置文件对系统中所有用户都会生效,可以为系统中的每个用户初始化工作环境, 而局部配置文件则只对相应用户生效。 当然,如果全局配置和局部配置发生冲突, 那么应以局部配置为准。

为什么Bash的配置文件要如此复杂?其实这是因为Bash 这个程序在Linux 系统中太重要了, 它要考虑大量不同的应用场合。 下面我们通过几个实例来说明这些配置文件的区别和应用。

(1)profile类文件
首先,我们仍以之前 的定义环境变量为例。我们希望可以将NAME定义为一个在所有终端上对所有用户都永久有效的环境变晕,那么就可以修改/etc/profile文件,系统中很多内置的环境变量就是由这个文件来定义的。打开该文件之后,可以发现这其实是一个Shell 脚本文件,里面有大量的代码,我们将光标移到文档末尾,在文档最后插入一行语句来定义环境变量。

[root@mysqldb profile.d]# echo "export NAME=teacher" >> /etc/profile

由于在Bash配置文件中定义的设置不会立即生效,因此我们可以使“source”或 “.”命令在当前Shell中重新加载配置文件,使其生效。

[root@mysqldb ~]# source /etc/profile

然后, 打开一个新的终端,并以 root用户身份登录,可以发现NAME变量仍然有效。 而且即使切换到其他用户,这个变量也仍然有效。修改/etc/profile文件之所以可以达到这样的效果,是因为系统中的所有用户在登录Shell时都会自动加载并执行这个文件中的设置。
另外,除修改/etc/profile文件之外, 我们也可以在/etc/profile.d目录中新建一个后缀为".sh"的脚本文件,并在这个文件中写入要自定义的环境变量,这可以达到相同的效果。

[root@mysqldb ~]# echo "export NAME=teacher" >> /etc/profile.d/name.sh
[root@mysqldb ~]# source /etc/profile.d/name.sh
[root@mysqldb ~]# echo $NAME
teacher

我们之前所做的这两种操作:修改/etc/profile 文件,在/etc/profile.d/目录中新建一个脚本文件并进行设置,它们实现的效果是相同的。在 CentOS 7系统中,推荐采用后一种方式。将一个大配置文件中的设置项按照类别提取出来,并分散存储在各个小配置文件中,这种模块化的设计思路在 CentOS 7系统中备受推崇,我们之后在对很多服务进行配置时也会发现这个特点。

除此之外,修改局部配置文件“~/.bash_profile”也可以实现类似的效果, 它们之间的区别是,/etc/profile文件对系统中的所有用户都有效,而~/.bash_profile则只对特定用户有效。 下面仍然通过实例来说明。
首先仍是将文件/etc/profile.cl/name.sh 删除,或者改成不以sh 作为文件名后缀,使其失效。 然后修改 root 用户家目录中的 “.bash_profile” 文件,在其中添加环境变量定义语句。

[root@mysqldb ~]# echo "export NAME=teacher" >> ~/.bash_profile
[root@mysqldb ~]# source ~/.bash_profile
[root@mysqldb ~]# echo $NAME
teacher

修改完成后执行 “source.bash_profile" 命令加载配置文件使其生效,然后在当前终端以及其他终端中以 root 用户身份登录时,都可以使用NAME 变量。但是,当切换到其他用户身份时,NAME 变量无效。
清楚了/etc/profile 文件和~/.bash_profile 文件的区别之后, 我们就可以根据需要来为系统中的所有用户或者某个用户定义环境变量。

(2)bashrc类文件
我们就了解了 profile 类配置文件,那么 bashrc类文件又是做什么的呢?其实这两类文件的作用是类似的,都可以用于定义用户在登录 Shell 时要自动执行的操作。它们的区别在之前也提到过: profile 类配置文件只在用户登录 Shell 时会被加载执行;而 bashrc 类配置文件除在用户登录 Shell 时会被加载执行之外,每当用户打开新的 Shell 或者子 Shell 时,都会被加载执行。

 [root@mysqldb ~]# echo "echo "hello world"" >> /etc/profile
 [root@mysqldb ~]# echo "echo "你好!"" >> /etc/bashrc
 [root@mysqldb ~]# su - ben
 hello world
 你好!
 [ben@mysqldb ~]$ bash
 你好!      

在理解所有这些 Bash 配置文件的特性之后,我们就可以发现它们的用途是非常广泛的,通过修改这些配置文件,就可以指定用户在登录 Shell 时自动执行某些操作。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ben@dw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值