概述
一、用户自定义的环境变量
1、环境变量设置
使用export
关键字声明的变量就是环境变量。
格式:[root@localhost ~ ] # export AGE="18"
也可以先定义一个自定义变量,然后把自定义变量声明称环境变量。如下:
[root@localhost ~ ] # AGE=18
[root@localhost ~ ] # export AGE
注:
环境变量名称一般要用大写。
环境变量的作用域,在父子shell中都可查看。
2、查询自定义环境变量
env
命令和set
命令的区别是,set命令可以查看所有变量,而env命令只能查看环境变量。(具体看上一篇文章)
这里说明一下env
命令和set
命令所查看的一些重要的内容,以后就不详细说明了。env
命令
set
命令env
命令可以查询到所有的环境变量,但是还有一些变量是env
命令查看不到的,这些变量虽然不是环境变量,却是和Bash操作接口相关的变量,这些变量也对我们的Bash操作终端起到了重要的作用。这些变量就只能用set命令来查看了,我只列出重要的内容吧:
3、删除自定义环境变量
和用户定义变量一样,用unset
命令删除变量。
#删除环境变量 gender
[root@localhost ~ ] # unset gender
二、系统自带的环境变量——PATH环境变量
系统自带的环境变量的名称和作用都不能够改变。
系统的环境变量,用上边介绍的env
命令和set
命令都可以查出。我们接下来说明几个比较重点的环境变量。
1、PATH环境变量
查看当前系统PATH环境变量的值:
[root@localhost ~ ] # echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
每次执行env命令和set命令都要在好多变量中找我们需要查看的变量很麻烦,可以使用上面的方式直接查看我们所需的变量的值。
2、PATH环境变量的作用
PATH变量的作用:系统查找命令的路径。
你回想一下,在说明shell执行脚本运行的时候说过,有两种方法可以执行shell脚本,一个是通过绝对路径或者相对路径执行脚本,如:/root/hello.sh或者./hello.sh。还有一种方法是直接执行bash命令执行脚本,如:bash hello.sh。我们当时建议用第一种方式。(在Linux系统中,所有的执行文件,都应该使用绝对路径来执行它)
但是我们有没有发现,比如我们之前所执行过的一些系统命令,如ls命令,我们知道ls命令在系统的bin目录下。如下图
但是我们直接执行ls
命令,并没有使用绝对路径,系统就能够执行ls
命令,这是为什么呢?
根本原因就是在这个PATH环境变量中。
PATH环境变量中配置的这些路径,就是系统查找命令的路径。也就是说当我们输入了一个程序名,如果没有写命令的路径,系统就会到PATH环境变量定义的路径中去寻找,是否有可以执行的程序。从左到右一个一个目录查找你所要执行的命令,找到了就直接执行,而如果把所有的目录都搜索完了,也没有找到你所执行的命令,就会报错,提示你-bash:变量名:command not found(命令没找到)
。换句话说也就是你这个命令执行的不正确,也或者说你所执行的命令,并没有配置在PATH环境变量中。
注意:PATH环境变量的值中,是用“:”分割的路径。
3、配置命令的环境变量
我们如何才能让一个自定义的程序或者脚本,不用输入绝对路径就能够执行呢?
有两种方式:
- 第一种方式:直接把程序或者脚本的可执行文件,直接复制到PATH环境变量下的任一个目录下即可。
#拷贝hello.sh文件到bin目录下
[root@localhost ~ ] # cp /root/sh/hello.sh /bin/
#hello.sh脚本即可以直接执行
[root@localhost ~ ] # hello.sh
Perhaps only heart no holdings, to being on land, settle.
也许只有心无所持,才能随遇而安。
- 第二种方式:把程序或者脚本所有在的路径,添加到PATH环境变量中即可。
通过变量的叠加就可以实现:
#在变量PATH的后面,加入/root/sh目录
[root@localhost ~ ] # PATH="$PATH":/root/sh
#查询PATH的值,变量叠加生效了
[root@localhost ~ ] # echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/sh
注意的是,我们这样定义的PATH环境变量只是临时生效,一旦重启或注销就会消失,如果想要永久生效,需要写入环境变量配置文件
/etc/profile
中。(可查看后续文章)
三、系统自带的环境变量——PS1环境变量
1、PS1变量的作用
PS1变量:命令提示符设置。也就是[root@localhost ~ ] #
的设置
PS1是一个很有意思的变量,是用来定义命令行提示符的,可以按照我们自己的需求来定义自己喜欢的提示符。
2、PS1变量的查看
- 直接查看PS1变量
[root@localhost ~ ] # echo $PS1
[u@h W]$
- 通过set命令查看
SP2变量是定义换行之后的命令提示符的显示。
2、PS1可以支持的选项
我们先解释一下系统命令提示符的组成[root@localhost ~ ] #
,我们之前说过root位置代表当前登陆的用户,localhost位置代表当前主机名的简写主机名,~
位置表示当前所在目录,第四列就是命令提示符。
而通过PS1变量我们得知上面的显示组成是如下选项:[u@h W]$
。
所以下面我们罗列出PS1支持的选项:
d
:显示日期,格式为星期 月 日
。H
:显示完整的主机名。如默认主机名localhost.localdomain
。h
:显示简写主机名。如默认简写主机名localhost
。t
:显示24小时制时间,格式为HH:MM:SS
。T
:显示12小时制时间,格式为HH:MM:SS
。A
:显示24小时制时间,格式为HH:MM
。@
:显示12小时制时间,格式为HH:MM am/pm
。u
:显示当前用户名。v
:显示Bash的版本信息。w
:显示当前所在目录的完整名称。W(大写)
:显示当前所在目录的最后一个目录。#
:执行的第几个命令。$
:提示符。如果是root用户会显示提示符为#
,如果是普通用户会显示提示符为$
。
注意:在PS1变量中,如果是可以解释的符号,如“u”、“h”等,则显示这个符号的作用。如果是不能解释的符号,如“@”或“空格”,则原符号输出。
总结:
#默认的提示符显示
#[用户名@简写主机名 所在目录最后一级] 提示符
[root@localhost ~ ] # echo $PS1
[u@h W]$
3、PS1环境变量的配置
其实我们在使用Linux系统的时候,还是比较习惯的默认的系统命令提示符的配置,也就是PS1变量的默认配置,一般我们是不做任何修改的,因为我们习惯了,修改了之后你会不舒服。如有需要,则看一下。
设置PS1环境变量,如下:
#修改提示符为
#[用户名@当前时间 当前所在完整目录] 提示符
[root@localhost ~ ] # PS1='[u@t w]$ (空格)'
# (空格)是因为习惯,看着舒服,不是必须。
#切换下当前所在目录
#因为家目录是看不出来区别的
[root@04:46:40 ~ ] # cd /usr/local/src/
[root@04:47:29 /usr/local/src] #
#提示符按照我们的设计发生了变化
这里一定要注意,PS1变量的值要用单引号包含,因为需要把PS1变量的选项中的特殊符号转变成普通的字符串(主要是$
符号),否则设置不生效。系统默认也是单引号设置的,你照着写就可以了。
扩展:再举个例子。
#可以同时给SP1设置更多的选项
[root@localhost ~ ] # PS1='[u@@ h # W]$ '
[root@04:53 上午 localhost 31 src] #
#@:显示12小时制时间,格式为HH:MM am/pm。
##:会显示执行了多少个命令。
PS1变量可以自由定制,不过说实话,默认的提示符已经使用习惯了,如果换一个还是非常别扭的,推荐默认的提示符就很好。
4、总结
我们上边在命令行中直接定义PS1变量的值是临时生效的,一旦重启电脑就会消失,如果需要永久生效,需要写入到对应的配置文件中的。
对应的配置文件为/etc/bashrc
,该文件也是一个环境变量的配置文件。如下图:
注意看图中SP1变量的配置,是加双引号的,需要在$
之前再加上一个,才能正常显示
$
。
四、系统自带的环境变量——LANG语系变量
1、LANG语系变量介绍
我们之前说过中文输出的问题,Linux系统的中文支持包括两个前提条件:
- 安装了中文字体和编码(安装的时候选择中文安装就安装过了)
- 操作终端必须支持中文编码。
而LANG变量定义了Linux系统的主语系环境,查看变量的默认值是:
[root@localhost ~ ] # echo $LANG
zh_CN.UTF-8
这是因为我们Linux安装时,选择的是中文安装,所以默认的主语系变量就是zh_CN.UTF-8
。
上边是通过远程终端查询的,而进入到系统自带的命令行终端执行上边命令,结果如下:
可以看到上图中显示的是英文语言en_US.UTF-8
,因为之前我们也说过,Linux的纯字符界面是不支持中文显示的(也就是不识别中文编码)。如果非要让Linux系统的纯字符界面显示中文,就需要安装中文插件。其实没有必要,因为我们的服务器一般都是在远程,我们很少会本机操作,通常使用远程终端登陆服务器,所有的远程终端基本上都是支持中文编码的。
总结:LANG变量显示的编码就是当前系统的现实语言。
2、如何查看Linux中支持的语系呢?
我们可以使用以下命令查询:[root@localhost ~ ] # locale -a
如下图:
Linux系统基本上支持所有的语言,一共可以支持700多种语言编码。
[root@localhost ~ ]# locale -a | more | wc -l735
但要注意一点的是,这里是显示支持的语言,而你有没有安装相应的编码,又是另外一回事。
3、查看当前系统的语系
使用locale命令直接查看当前系统的语言环境。
可以从上图看出,因为我们安装时候选择的是中文安装,Linux系统中的这些默认语系就是人中文编码。
我们还要通过文件/etc/sysconfig/i18n
文件,定义系统的默认语系。所谓默认语系,也就是开机之后,Linux系统就支持的语系。
查看下这个文件的内容:
[root@localhost src]# cat /etc/sysconfig/i18n
LANG="zh_CN.UTF-8"
这又是当前系统语系,又是默认语系。我们可以这样理解,默认语系是下次重启之后系统所使用的语系,而当前系统语系是当前系统使用的语系。如果系统重启,会从默认语系配置文件/etc/sysconfig/i18n
中读出语系,然后赋予变量LANG让这个语系生效。也就是说,LANG定义的语系只对当前系统生效,要想永久生效就要修改/etc/sysconfig/i18n
文件了。
4、总结
上边的描述有的地方看起来很乱,我们这里总结一下:
- 查看Linux中支持的语系
可执行[root@localhost ~ ] # locale -a
命令。
查询的结果只代表支持语言,并不代表安装了该语言编码。 - 查看当前系统的语言环境
可执行[root@localhost ~ ] # locale
命令。 /etc/sysconfig/i18n
文件中存储的是系统默认使用的字符集。是Linux系统开机就生效的,和终端没有关系。所以LANG变量的值,开机默认就是/etc/sysconfig/i18n
文件中存储属性。- 在开机之后设置的LANG变量是临时生效的。
最后我们在总结一下Linux系统中文显示的问题:
我们需要解释下Linux中文支持的问题。是不是我们只要定义了语系为中文语系,如zh_CN.UTF-8
就可以正确显示中文了呢?
这要分情况:
(1)如果我们是在图形界面中,或者是使用远程连接工具(如SecureCRT),只要正确设置了语系,那么是可以正确显示中文的,当然远程连接工具也要配置正确的中文语系环境。
总结两点:
安装了中文字体和编码。
操作终端必须支持中文编码。
(2)那么如果是纯字符界面(本地终端tty1-tty6
)是不能显示中文的,因为Linux的纯字符界面是不能显示中文这么复杂的编码的。如果我们非要在纯字符界面显示中文,那么只能安装中文插件,如zhcon等。
最好我这里给你们分享一下我所积累和真理的文档和学习资料有需要是领取就可以了
1、学习思路和方法
这个大纲涵盖了目前市面上企业百分之99的技术,这个大纲很详细的写了你该学习什么内容,企业会用到什么内容。总共十个专题足够你学习
2、想学习却无从下手,该如何学习?
这里我准备了对应上面的每个知识点的学习资料、可以自学神器,已经项目练手。
3、软件测试/自动化测试【全家桶装】学习中的工具、安装包、插件....
4、有了安装包和学习资料,没有项目实战怎么办,我这里都已经准备好了往下看
5、如何领取这些配套资料和学习思路图,以及项目实战源码。
这些资料都已经让我准备在一个php网页里面了,可以在里面领取扫码或者进Q群交流都可以暗号和备注是111哦
最后送上一句话:
世界的模样取决于你凝视它的目光,自己的价值取决于你的追求和心态,一切美好的愿望,不在等待中拥有,而是在奋斗中争取。
如果我的博客对你有帮助、如果你喜欢我的文章内容,请 “点赞” “评论” “收藏” 一键三连哦!
最后
以上就是威武小蝴蝶为你收集整理的Shell基础— 环境变量全套的全部内容,希望文章能够帮你解决Shell基础— 环境变量全套所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复