export命令

功能: 将一个shell变量输出为环境变量; 或将shell函数输出为环境变量

export命令的语法格式:export [参数]

-f:代表[变量名称]为函数名称
-n:删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中
-p:列出所有的shell赋予程序的环境变量

注意:

  • 在linux中,当一个变量创建后,在其它的shell进程中并不能访问,
    此时我们就可以使用export命令,将变量设置为环境变量,别的shell进程就可以访问到此变量值。
  • 但是采用export设置的环境变量,在退出Shell后就会失效,下次登录时需要重新设置。如果希望环境变量永久生效,需要在登录脚本文件中配置。

举例:

# 新建shell变量
[root@node1 ~]# TPH="张三"

#新建文件,授予执行权限
[root@node1 ~]# vim ./tph.sh
[root@node1 ~]# cat ./tph.sh
echo $TPH
[root@node1 ~]# chmod u+x tph.sh

# 执行文件TPH没有值,因为是shell变量不是全局变量,在其它的shell进程中并不能访问
[root@node1 ~]# ./tph.sh

# 输出TPH变量有值,shell变量,在当前shell进程中可以访问
[root@node1 ~]# echo $TPH
张三

# 使用export命令,将变量设置为环境变量
[root@node1 ~]# export TPH

#环境变量,别的shell进程也可以访问到此变量值
[root@node1 ~]# ./tph.sh
张三

环境变量

1、环境变量的含义

程序(操作系统命令和应用程序)的执行都需要运行环境,这个环境是由多个环境变量组成的。

2、环境变量的分类

1)按生效的范围分类。

系统环境变量:公共的,对全部的用户都生效。
用户环境变量:用户私有的、自定义的个性化设置,只对该用户生效。

2)按生存周期分类。

永久环境变量:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效。
临时环境变量:使用时在Shell中临时定义,退出Shell后失效。

3、Linux环境变量

Linux环境变量也称之为Shell环境变量,以下划线和字母打头,由下划线、字母(区分大小写)和数字组成,习惯上使用大写字母,例如PATH、HOSTNAME、LANG等。

4、常用的环境变量

1、查看环境变量

1)env命令
在Shell下,用env命令查看当前用户全部的环境变量。

[root@node1 ~]# env
KAFKA_HOME=/usr/local/kafka_2.11-2.0.0
XDG_SESSION_ID=107
SPARK_HOME=/usr/local/spark-2.4.3-bin-hadoop2.7
HOSTNAME=node1
AZKABAN_EXE_HOME=/usr/local/azkaban-executor-2.5.0
TERM=xterm
SHELL=/bin/bash
HADOOP_HOME=/usr/local/hadoop-2.7.1
CATALINA_HOME=/usr/local/tomcat8/apache-tomcat-8.5.66
HISTSIZE=1000
SSH_CLIENT=192.168.76.3 51855 22
TPH=张三
SQOOP_HOME=/usr/local/sqoop-1.4.7.bin__hadoop-2.6.0
ZK_HOME=/usr/local/zookeeper-3.3.6
SSH_TTY=/dev/pts/4
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
AZKABAN_WEB_HOME=/usr/local/azkaban-web-2.5.0
FLUME_HOME=/usr/local/apache-flume-1.9.0-bin
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/java/jdk8/jdk1.8.0_151/bin:/usr/local/tomcat8/apache-tomcat-8.5.66/bin:/usr/local/hadoop-2.7.1/bin:/usr/local/hadoop-2.7.1/sbin:/usr/local/zookeeper-3.3.6/bin:/usr/local/apache-hive-2.3.6-bin/bin:/usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/azkaban-web-2.5.0/bin:/usr/local/azkaban-executor-2.5.0/bin:/usr/local/kafka_2.11-2.0.0/bin:/usr/local/apache-flume-1.9.0-bin/bin:/usr/local/spark-2.4.3-bin-hadoop2.7/bin:/root/bin
HIVE_HOME=/usr/local/apache-hive-2.3.6-bin
PWD=/root
JAVA_HOME=/usr/java/jdk8/jdk1.8.0_151
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
CLASSPATH=.:/usr/java/jdk8/jdk1.8.0_151/jre/lib/rt.jar:/usr/java/jdk8/jdk1.8.0_151/lib/dt.jar:/usr/java/jdk8/jdk1.8.0_151/lib/tools.jar
SSH_CONNECTION=192.168.76.3 51855 192.168.76.200 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env

用env命令的时候,满屏显示了很多环境变量,不方便查看,可以用grep筛选。
env|grep 环境变量名

例如:查看环境变量名中包含PATH的环境变量。

[root@node1 ~]# env|grep "PATH"
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/java/jdk8/jdk1.8.0_151/bin:/usr/local/tomcat8/apache-tomcat-8.5.66/bin:/usr/local/hadoop-2.7.1/bin:/usr/local/hadoop-2.7.1/sbin:/usr/local/zookeeper-3.3.6/bin:/usr/local/apache-hive-2.3.6-bin/bin:/usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/azkaban-web-2.5.0/bin:/usr/local/azkaban-executor-2.5.0/bin:/usr/local/kafka_2.11-2.0.0/bin:/usr/local/apache-flume-1.9.0-bin/bin:/usr/local/spark-2.4.3-bin-hadoop2.7/bin:/root/bin
CLASSPATH=.:/usr/java/jdk8/jdk1.8.0_151/jre/lib/rt.jar:/usr/java/jdk8/jdk1.8.0_151/lib/dt.jar:/usr/java/jdk8/jdk1.8.0_151/lib/tools.jar

2、常用的环境变量

1)PATH

可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序,即执行程序只有在该目录下,才可以在任意目录下执行,而不需要带路径。

[root@node1 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/java/jdk8/jdk1.8.0_151/bin:/usr/local/tomcat8/apache-tomcat-8.5.66/bin:/usr/local/hadoop-2.7.1/bin:/usr/local/hadoop-2.7.1/sbin:/usr/local/zookeeper-3.3.6/bin:/usr/local/apache-hive-2.3.6-bin/bin:/usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/azkaban-web-2.5.0/bin:/usr/local/azkaban-executor-2.5.0/bin:/usr/local/kafka_2.11-2.0.0/bin:/usr/local/apache-flume-1.9.0-bin/bin:/usr/local/spark-2.4.3-bin-hadoop2.7/bin:/root/bin

2)LANG

Linux系统的语言、地区、字符集,LANG变量的具体用法本文后面的章节中有详细的介绍。

[root@node1 ~]# echo $LANG
en_US.UTF-8

3)HOSTNAME

服务器的主机名。

[root@node1 ~]# echo $HOSTNAME
node1

4)SHELL

用户当前使用的Shell解析器。

[root@node1 ~]# echo $SHELL
/bin/bash

5)HISTSIZE

保存历史命令的数目。

[root@node1 ~]# echo $HISTSIZE
1000

6)USER

当前登录用户的用户名。

[root@node1 ~]# echo $USER
root

7)HOME

当前登录用户的主目录。

[root@node1 ~]# echo $HOME
/root

8)PWD

当前工作目录。

9)LD_LIBRARY_PATH

C/C++语言动态链接库文件搜索的目录,它不是Linux缺省的环境变量,但对C/C++程序员来说非常重要,具体用法本文后面的章节中有详细的介绍。

10)CLASSPATH

JAVA语言库文件搜索的目录,它也不是Linux缺省的环境变量,但对JAVA程序员来说非常重要,具体用法本文后面的章节中有详细的介绍。

5、设置环境变量

变量名=‘值’
export 变量名

export 变量名=‘值’

如果环境变量的值没有空格等特殊符号,可以不用单引号包含。

示例:

export ORACLE_HOME=/oracle/home
export ORACLE_BASE=/oracle/base
export ORACLE_SID=snorcl11g
export NLS_LANG=‘Simplified Chinese_China.ZHS16GBK’
export PATH=shell 命令 改 环境变量 java_home linux shell 设置环境变量_环境变量HOME/bin:shell 命令 改 环境变量 java_home linux shell 设置环境变量_服务器_02LD_LIBRARY_PATH:$ORACLE_HOME/lib:.

采用export设置的环境变量,在退出Shell后就会失效,下次登录时需要重新设置。如果希望环境变量永久生效,需要在登录脚本文件中配置。

1、配置系统环境变量

系统环境变量对全部的用户生效,设置系统环境变量有三种方法。

1)在/etc/profile文件中设置。

用户登录时执行/etc/profile文件中设置系统的环境变量。但是,Linux不建议在/etc/profile文件中设置系统环境变量。

2)在/etc/profile.d目录中增加环境变量脚本文件(Linux推荐)

/etc/profile在每次启动时会执行 /etc/profile.d下全部的脚本文件。/etc/profile.d比/etc/profile好维护,不想要什么变量直接删除 /etc/profile.d下对应的 shell 脚本即可。

/etc/profile.d目录下有很多脚本文件,例如:

shell 命令 改 环境变量 java_home linux shell 设置环境变量_hadoop_03


在以上示例中,/etc/profile.d目录中的oracle.sh是Oracle数据库的环境变量配置文件,内容如下:

shell 命令 改 环境变量 java_home linux shell 设置环境变量_bash_04


3)在/etc/bashrc文件中设置环境变量。

该文件配置的环境变量将会影响全部用户使用的bash shell。但是,Linux也不建议在/etc/bashrc文件中设置系统环境变量。

2、用户环境变量

用户环境变量只对当前用户生效,设置用户环境变量也有多种方法。
在用户的主目录,有几个特别的文件,用ls是看不见的,用ls .bash_*可以看见。

[root@node1 ~]# ls .bash_*
.bash_history  .bash_logout  .bash_profile

1).bash_profile(推荐首选)

当用户登录时执行,每个用户都可以使用该文件来配置专属于自己的环境变量。

2).bashrc

当用户登录时以及每次打开新的Shell时该文件都将被读取,不推荐在里面配置用户专用的环境变量,因为每开一个Shell,该文件都会被读取一次,效率肯定受影响。

3).bash_logout

当每次退出系统(退出bash shell)时执行该文件。

4).bash_history

保存了当前用户使用过的历史命令。

3、环境变量脚本文件的执行顺序

环境变量脚本文件的执行顺序如下:

/etc/profile->/etc/profile.d->/etc/bashrc->用户的.bash_profile->用户的.bashrc

同名的环境变量,如果在多个脚本中有配置,以最后执行的脚本中的配置为准。

还有一个问题需要注意,在/etc/profile中执行了/etc/profile.d的脚本,代码如下

for i in /etc/profile.d/*.sh ; do
if [ -r “shell 命令 改 环境变量 java_home linux shell 设置环境变量_环境变量_05{-#*i}” != “shell 命令 改 环境变量 java_home linux shell 设置环境变量_环境变量_06i”
else
. “$i” >/dev/null
fi
fi
done

所以,/etc/profile.d和/etc/profile的执行顺序还要看代码怎么写。

6、重要环境变量的详解

1、PATH环境变量

可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序。如果可执行程序的目录不在PATH指定的目录中,执行时需要指定目录。

1)PATH环境变量存放的是目录列表,目录之间用冒号:分隔,最后的圆点.表示当前目录。

export PATH=目录1:目录2:目录3:…目录n:.

2)PATH缺省包含了Linux系统命令所在的目录(/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin),如果不包含这些目录,Linux的常用命令也无法执行(要输入绝对路径才能执行)。

shell 命令 改 环境变量 java_home linux shell 设置环境变量_环境变量_07


3)在用户的.bash_profile文件中,会对PATH进行扩充,如下:

export PATH=$PATH:$HOME/bin

4)如果PATH变量中没有包含圆点.,执行当前目录下的程序需要加./或使用绝对路径。

示例:

shell 命令 改 环境变量 java_home linux shell 设置环境变量_bash_08

2、LANG环境变量

LANG环境变量存放的是Linux系统的语言、地区、字符集,它不需要系统管理员手工设置,/etc/profile会调用/etc/profile.d/lang.sh脚本完成对LANG的设置。

CentOS6.x 字符集配置文件在/etc/syscconfig/i18n文件中。

CentOS7.x 字符集配置文件在/etc/locale.conf文件中,内容如下:

[root@node1 ~]# cat /etc/locale.conf
LANG="en_US.UTF-8"

3、LD_LIBRARY_PATH环境变量

C/C++语言动态链接库文件搜索的目录,它不是Linux缺省的环境变量,但对C/C++程序员来说非常重要。

LD_LIBRARY_PATH环境变量存放的也是目录列表,目录之间用冒号:分隔,最后的圆点.表示当前目录,与PATH的格式相同。

export LD_LIBRARY_PATH=目录1:目录2:目录3:…目录n:.
4、CLASSPATH

JAVA语言库文件搜索的目录,它也不是Linux缺省的环境变量,但对JAVA程序员来说非常重要。

CLASSPATH环境变量存放的也是目录列表,目录之间用冒号:分隔,最后的圆点.表示当前目录,与PATH的格式相同。

7、环境变量的生效

1)在Shell下,用export设置的环境变量对当前Shell立即生效,Shell退出后失效。

2)在脚本文件中设置的环境变量不会立即生效,退出Shell后重新登录时才生效,或者用source命令让它立即生效,例如:

source /etc/profile

8、应用经验

虽然设置环境变量的方法有多种,但是建议系统环境变量建议在/etc/profile.d目录中配置,用户环境变量在用户的.bash_profile中配置,不建议在其它脚本文件中配置环境变,会增加运维的麻烦,容易出错。