Linux的变量种类
按变量的生存周期来划分,Linux变量可分为两类:
1 永久的:需要修改配置文件,变量永久生效。
2 临时的:使用export命令声明即可,变量在关闭shell时失效。
设置变量的三种方法
直接运行export命令定义变量【只对当前shell(bash)有效(临时的)】
在shell的命令行下直接使用 export variable=value
。该变量只在当前的shell(bash)或其子shell(bash)下是有效的。shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。
在/etc/profile文件中添加变量【对所有用户生效(永久的)】
在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。
例如:编辑/etc/profile文件,添加CLASSPATH变量
# vim /etc/profile
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
注:修改文件后要想马上生效还要运行$ sudo source /etc/profile
,不然只能在下次重进此用户时生效。
在用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)】
在用户目录下的.bash_profile文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。
例如:编辑guok用户目录(/home/guok)下的.bash_profile
$ vim /home/guok/.bash.profile 添加如下内容:
export CLASSPATH=./JAVAHOME/lib;JAVA_HOME/jre/lib
注:修改文件后要想马上生效还要运行$ source /home/guok/.bash_profile
,不然只能在下次重进此用户时生效。
为什么修改/etc/profile和用户目录下的.bash_profile文件就能导入环境变量且作用范围不一样呢?
这个和login shell的流程有关。我们每次开启一个终端,系统会默认读取配置文件来配置好环境等信息。首先对所有用户会默认读取/etc/profile这个文件,它接着读取或调用/etc/profile.d/*.sh和/etc/locale.conf。接着,对于不同的用户,系统会 依次 查看并执行用户根目录下的.bash_profile、.bash_login、.profile文件。这里注意,系统并不会三个文件都执行,而是会执行 第一个找到 的文件,所以这三个文件并不一定都会在用户的根目录出现。
对此,我们有需要也可以在这几个文件下写下自己需要的脚本,实现进去终端自动执行。
环境变量的查看与删除
1 使用echo
命令查看单个环境变量。例如: echo $PATH
2 使用env
查看所有环境变量。
3 使用set
查看变量(包括环境变量和自定义变量)。
4 使用unset
删除指定的变量
set可以设置某个环境变量的值。相对的,清除环境变量的值用unset命令。如果未指定值,则该变量值将被设为NULL。示例如下:
#增加一个环境变量TEST
$ export TEST="Test..."
$ env | grep TEST
#此命令有输出,证明环境变量TEST已经存在了
$ TEST=Test...
$
#删除环境变量TEST
$ unset TEST
$ env|grep TEST
#此命令没有输出,证明环境变量TEST已经删除
$
由export
和set
我们知道环境变量和自定义变量,那这两种变量到底有什么区别呢?
差异主要在于两者是否能被子进程使用。
我们在shell命令行敲下一个命令时,其实是让当前终端这个进程(一般也就是bash)生成一个子进程去执行,而父进程则会等待。这时候,子进程仅会继承父进程的环境变量,而不会继承自定义变量(即我们使用$ variable=value
这种方式定义的变量)。export
方式可以让我们传递变量到子进程去使用。
相反的,我们可以使用declare
来将环境变量转变为自定义变量
常用的环境变量
名称 | 作用 |
---|---|
PATH | 决定了shell将到哪些目录中寻找命令或程序 |
HOME | 当前用户主目录 |
HISTSIZE | 历史记录数 |
LOGNAME | 当前用户的登录名 |
HOSTNAME | 指主机的名称 |
SHELL | 当前用户Shell类型 |
LANGUGE | 语言相关的环境变量,多语言可以修改此环境变量 |
当前用户的邮件存放目录 | |
PS1 | 基本提示符,对于root用户是#,对于普通用户是$ |
网友评论