Linux【8】-软件管理-9-软件安装1-环境变量的修改(env/export/profile/PATH)

  • 变量是计算机系统用于保存可变值的数据类型,我们可以直接通过变量名称来提取到对应的变量值。
  • 在 Linux 系统中,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录(HOME)、邮件存放位置(MAIL)等。
  • 值得一提的是,Linux 系统中环境变量的名称一般都是大写的,这是一种约定俗成的规范。

一、常见环境变量

我们可以使用 env 命令来查看到 Linux 系统中所有的环境变量,执行命令如下:

[root@localhost ~]# env
ORBIT_SOCKETDIR=/tmp/orbit-root
HOSTNAME=livecd.centos
GIO_LAUNCHED_DESKTOP_FILE_PID=2065
TERM=xterm
SHELL=/bin/bash
......

Linux 系统能够正常运行并且为用户提供服务,需要数百个环境变量来协同工作,但是,我们没有必要逐一学习每个变量,这里给大家列举了 10 个非常重要的环境变量,如表 1 所示。

表 1 Linux系统中重要的10个环境变量

环境变量名称 作用
HOME 用户的主目录(也称家目录)
SHELL 用户使用的 Shell 解释器名称
PATH 定义命令行解释器搜索用户执行命令的路径
EDITOR 用户默认的文本解释器
RANDOM 生成一个随机数字
LANG 系统语言、语系名称
HISTSIZE 输出的历史命令记录条数
HISTFILESIZE 保存的历史命令记录条数
PS1 Bash解释器的提示符
MAIL 邮件保存路径

Linux 作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境,因此,一个相同的环境变量会因为用户身份的不同而具有不同的值。

例如,使用下述命令来查看 HOME 变量在不同用户身份下都有哪些值:

[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# su - user1  <--切换到 user1 用户身份
[user1@localhost ~]$ echo $HOME
/home/user1

这里的 su 命令可以临时切换用户身份,此命令的具体用法会在后续章节做详细介绍。

其实,环境变量是由固定的变量名与用户或系统设置的变量值两部分组成的,我们完全可以自行创建环境变量来满足工作需求。例如,设置一个名称为 WORKDIR 的环境变量,方便用户更轻松地进入一个层次较深的目录,执行命令如下:

[root@localhost ~]# mkdir /home/work1
[root@localhost ~]# WORKDIR=/home/work1
[root@localhost ~]# cd $WORKDIR
[root@localhost work1]# pwd
/home/work1

但是,这样的环境变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用。如果工作需要,可以使用 export 命令将其提升为全局环境变量,这样其他用户就可以使用它了:

[root@localhost work1]# su user1  <-- 切换到 user1,发现无法使用 WORKDIR 自定义变量
[user1@localhost ~]$ cd $WORKDIR
[user1@localhost ~]$ echo $WORKDIR

[user1@localhost ~]$ exit <--退出user1身份
[root@localhost work1]# export WORKDIR
[root@localhost work1]# su user1
[user1@localhost ~]$ cd $WORKDIR
[user1@localhost work1]$ pwd
/home/work1

二、环境变量配置文件

Linux中环境变量包括系统级和用户级

  • 系统级的环境变量是每个登录到系统的用户都要读取的系统变量
  • 而用户级的环境变量则是该用户使用系统时加载的环境变量。

所以管理环境变量的文件也分为系统级和用户级的

2.1 系统级

/etc/profile

该文件是用户登录时,操作系统定制用户环境时使用的第一个文件,应用于登录到系统的每一个用户。该文件一般是调用/etc/bash.bashrc文件。/etc/bash.bashrc系统级的bashrc文件。

/etc/environment

在登录时操作系统使用的第二个文件,系统在读取你自己的profile前,设置环境文件的环境变量。

2.2 用户级(这些文件处于家目录下)

~/.profile

每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。这里是推荐放置个人设置的地方

~/.bashrc

该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。不推荐放到这儿,因为每开一个shell,这个文件会读取一次,效率肯定有影响。 ~/.bash_profile or ~./bash_login:,在登录shell时会读取./bash_profile文件,而不是.profile文件。我认为该文件实现的目的 跟.profile文件是一样的,当查找的资料中需要你修改.bash_profile文件,但却你没有该文件的时候,也可以修改.profile来完成实现。 ~/.pam_environment:用户级的环境变量设置文件,没有做测试,不知道管不管用。

三、环境变量设置

查看环境变量

$PATH
-bash: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:

env 可以看到所有的环境变量

方法一: export

export PATH=$PATH:/etc/apache/bin

使用这种方法,只对当前会话有效,也就是说每当登出或注销系统以后,PATH 设置就会失效

方法二

vi /etc/profile

/etc/profile为系统整体的设置,最好不要修改这个文件

  • 在适当位置添加PATH=$PATH:/etc/apache/bin (注意:= 即等号两边不能有任何空格)
  • 这种方法最好,除非你手动强制修改PATH的值,否则将不会被改变
  • 以管理员身份 source /etc/profile来生效
  • export PATH=/data/software/anaconda2/bin:$PATH # /data/software/anaconda2/bin会取代/bin/python ;这里的顺序很重要

方法三

vi ~/.bash_profile

~/.bash_profile或~/.bash_login或~/.profile这个属于用户个人设置,你要改自己的数据,就写入这里。(我的这个是~/.profile或者~/.bashrc) 修改PATH行,把/etc/apache/bin添加进去 这种方法是针对用户起作用的

注意:想改变PATH,必须重新登陆才能生效,以下方法可以简化工作: 如果修改了/etc/profile,那么编辑结束后执行source profile 或 执行点命令 ./profile,PATH的值就会立即生效了。 这个方法的原理就是再执行一次/etc/profile shell脚本,注意如果用sh /etc/profile是不行的,因为sh是在子shell进程中执行的,即使PATH改变了也不会反应到当前环境中,但是source是在当前 shell进程中执行的,所以我们能看到PATH的改变。

四、PATH环境变量及作用

在讲解 PATH 环境变量之前,首先介绍一下 which 命令,它用于查找某个命令所在的绝对路径。例如:

[root@localhost ~]# which rm
/bin/rm
[root@localhost ~]# which rmdir
/bin/rmdir
[root@localhost ~]# which ls
alias ls='ls --color=auto'
        /bin/ls

注意,ls 是一个相对特殊的命令,它使用 alias 命令做了别名,也就是说,我们常用的 ls 实际上执行的是 ls –color=auto。

通过使用 which 命令,可以查找各个外部命令(和 Shell 内置命令相对)所在的绝对路径。学到这里,读者是否有这样一个疑问,为什么前面在使用 rm、rmdir、ls 等命令时,无论当前位于哪个目录,都可以直接使用,而无需指明命令的执行文件所在的位置(绝对路径)呢?其实,这是 PATH 环境变量在起作用。

首先,执行如下命令:

[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin

这里的 echo 命令用来输出 PATH 环境变量的值(这里的 $ 是 PATH 的前缀符号),PATH 环境变量的内容是由一堆目录组成的,各目录之间用冒号“:”隔开。当执行某个命令时,Linux 会依照 PATH 中包含的目录依次搜寻该命令的可执行文件,一旦找到,即正常执行;反之,则提示无法找到该命令。

如果在 PATH 包含的目录中,有多个目录都包含某命令的可执行文件,那么会执行先搜索到的可执行文件。

从执行结果中可以看到,/bin 目录已经包含在 PATH 环境变量中,因此在使用类似 rm、rmdir、ls等命令时,即便直接使用其命令名,Linux 也可以找到该命令。

为了印证以上观点,下面举个反例,如果我们将 ls 命令移动到 /root 目录下,由于 PATH 环境变量中没有包含此目录,所有当直接使用 ls 命令名执行时,Linux 将无法找到此命令的可执行文件,并提示 No such file or directory,示例命令如下:

[root@localhost ~]# mv /bin/ls /root
[root@localhost ~]# ls
bash: /bin/ls: No such file or directory

此时,如果仍想使用 ls 命令,有 2 种方法,一种是直接将 /root 添加到 PATH 环境变量中,例如:

[root@localhost ~]# PATH=$PATH:/root
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin:/root
[root@localhost ~]# ls
Desktop    Downloads    Music    post-install     Public    Videos
Documents  ls           Pictures post-install.org Templates

注意,这种方式只是临时有效,一旦退出下次再登陆的时候,$PATH 就恢复成了默认值。

另一种方法是以绝对路径的方式使用此命令,例如:

[root@localhost ~]# /root/ls
Desktop    Downloads    Music    post-install     Public    Videos
Documents  ls           Pictures post-install.org Templates

为了不影响系统的正常使用,强烈建议大家将移动后的 ls 文件还原,命令如下:

[root@localhost ~]# mv /root/ls /bin

五、我的配置

export PATH=/home/qqin/bin:/bioinfo/software/sbin:/bioinfo/software/lib:/bioinfo/software/include:/bioinfo/software/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/zgong/genopipe_py/bin
export PYTHONPATH=$PYTHONPATH:/home/qqin/lib64/python2.7/site-packages:/home/qqin/lib/python2.7/site-packages:/home/qqin/project/packages
PS1='${debian_chroot:+($debian_chroot)}\u@\h:[\W]\$'

#PERL_MB_OPT="--install_base \"/home/qqin/perl5\""; export PERL_MB_OPT;
#PERL_MM_OPT="INSTALL_BASE=/home/qqin/perl5"; export PERL_MM_OPT;

export PERLLIB=$PERL5LIB:/home/qqin/perl5/lib

六、讨论

6.1 使用 /etc/profile.d 而不是 /etc/profile 来配置环境变量

在 /etc/profile 这个文件中有这么一段 shell, 会在每次启动时自动加载 profile.d 下的每个配置

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

区别:

  1. 都用来设置环境变量文件
  2. /etc/profile.d/ 高度解耦, 比 /etc/profile 好维护,不想要什么变量直接删除 /etc/profile.d/ 下对应的 shell 脚本即可
  3. /etc/profile 和 /etc/profile.d 同样是登录(login)级别的变量,当用户重新登录 shell 时会触发。所以效果一致。
  4. 设置登录级别的变量,重新登录 shell,或者 source /etc/profile。

  需要添加新的环境变量时:

在 /etc/profile.d/ 目录下新建对应的 sh 文件即可,比如新建 java 的:

vim /etc/profile.d/kafka.sh
export KAFKA_HOME=/opt/module/kafka
export PATH=$PATH:$KAFKA_HOME/bin

立即刷新使变量可用

回到上一次目录 source /etc/profile

查看

echo $KAFKA_HOME

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn