打印环境变量
打印环境变量命令
命令 | 说明 |
---|---|
set | 显示当前shell的所有变量包括其内建环境变量(与shell外观等相关),用户自定义变量及导出的环境变量 |
env | 显示与当前用户相关的环境变量,还可以让命令在指定环境中运行 |
export | 显示从shell中导出成环境变量的变量,也可以通过他将自定义变量导成全局变量。 |
结果对比
#设置变量
[root@0524 ~]# temp=kylin
[root@0524 ~]# export temp_env=kylin
#查看变量输出结果
[root@0524 ~]# env | grep kylin
temp_env=kylin
[root@0524 ~]# export | grep kylin
declare -x temp_env="kylin"
[root@0524 ~]# set | grep kylin
temp=kylin
temp_env=kylin
#将命令结果输出到文件
[root@0524 ~]# env | sort > env.txt
[root@0524 ~]# export | sort > export.txt
[root@0524 ~]# set | sort > set.txt
#对比结果
[root@0524 ~]# vimdiff env.txt export.txt set.txt
HISTSIZE=1000 | declare -x HISTSIZE="1000" | ;;
HOME=/root | declare -x HOME="/root" | ;;
HOSTNAME=0524 | declare -x HOSTNAME="0524" | *)
LANG=zh_CN.UTF-8 | declare -x LANG="zh_CN.UTF-8" | *)
LOGNAME=root | declare -x LOGNAME="root" | *)
............
环境变量修改方式
修改方式
变量修改方式 | 说明 |
---|---|
${变量名#匹配字串} | 从头向后开始匹配,删除符合匹配字串的最短数据。 |
${变量名##匹配字串} | 从头向后开始匹配,删除符合匹配子串的最长数据。 |
${变量名%匹配字串} | 从尾向前开始匹配,删除符合匹配字串的最短数据。 |
${变量名%%匹配字串} | 从尾向前开始匹配,删除符合匹配字串的最长数据 |
${变量名/旧的字串/新的字串} | 将符合旧字串的第一个字串替换为新的字串 |
${变量名//旧的字串/新的子串} | 将符合旧字串的全部字串替换为新的字串 |
${变量名#匹配字串}
#从头向后开始匹配,删除符合匹配字串的最短数据。
[root@0518 ~]# path=$PATH #变量赋值
[root@0518 ~]# echo $path #查看变量
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/.dotnet/tools:/root/bin
[root@0518 ~]# path=${path#/usr} #删除字符串
[root@0518 ~]# echo $path #查看
/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/.dotnet/tools:/root/bin
环境变量配置文件
系统级
/etc/environment,
是系统在登录时读取的第一个文件,用于为所有进程设置环境变量。系统使用此文件时并不是执行此文件中的命令,而是根据KEY=VALUE模式的代码,对KEY赋值以VALUE,因此文件中如果要定义PATH环境变量,只需要加入一行如PATH=$PATH:/xxx/bin的代码即可
生效时间: 新开终端生效,或者手动source /etc/environment生效
生效期限: 永久有效
生效范围: 对所有用户有效
/etc/profile
是系统登录时执行的第二个文件,可以用于设定针对全系统所有用户的环境变量。该文件一般是调用/etc/bashrc文件。
生效时间: 新开终端生效,或者手动source /etc/profile生效
生效期限: 永久有效
生效范围: 对所有用户有效
/etc/bashrc
系统级的bashrc文件,为每一个运行bash shell的用户执行此文件。此文件会在用户每次打开shell时执行一次。
生效时间: 新开终端生效,或者手动source /etc/bashrc生效
生效期限: 永久有效
生效范围: 对所有用户有效
注意
- /etc/environment是设置整个系统的环境,而/etc/profile是设置所有用户的环境,前者与用户登录无关,后者与用户登录有关。
- 这两个文件修改一般都要重启操作系统生效。
- 如果同一个变量在用户环境(/etc/profile)和系统环境(/etc/environment)有不同的值,则以用户环境为准。
用户级(文件处于用户家目录下)
~/.bash_profile
是对应当前登录用户的profile文件,用于定制当前用户的个人工作环境。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。默认情况下,他设置一些环境变量,执行用户的.bashrc文件。这里是推荐放置个人设置的地方。
生效时间: 使用相同的用户打开新的终端时生效,或手动source ~/.bash_profile生效
生效期限: 永久有效
生效范围: 仅对当前用户生效
~/.bashrc
是对应当前用户登录的bash初始化文件,当用户每次打开shell时,系统都会执行此文件一次。
生效时间: 使用相同的用户打开新的终端时生效,或手动source ~/.bashrc生效
生效期限: 永久生效
生效范围: 仅对当前用户生效
注意
-
~/.profile可以设定本用户专有的路径,环境变量等,他只能登入的时候执行一次。
-
~/.bashrc也是用户专有的设定文档,可以设定路径,命令别名等,用户每次打开shell都会使用他一次。
-
每次退出shell,会读取~/.bash_logout
用户登录顺序
1. /etc/environment
2. /etc/profile
3. /etc/bash.bashrc
4. ~/.profile
5. ~/.bashrc
特殊的环境变量
locale
文件位置
涉及语言和符号等locale设置,语言不匹配会出现字符框等乱码现象。可以再/etc/locale.conf中配置,也可以在/etc/profile配置,注意生效范围。
配置方法
#查看配置文件
[root@0524 ~]# cat /etc/locale.conf
LANG="zh_CN.UTF-8"
#命令查看
[root@0524 ~]# locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
#说明
LC_ALL : 一个宏,如果该值设置了,则会覆盖所有的LC_*的设置。
LC_CTYPE : 语言符号及其分类。
LANG : 可以看做是所有未被设置的locale变量的默认值。
LANGUAGE : 许多应用程序读取这个变量作为界面语言。
#优先级 优先级低的会被优先级高的覆盖
LC_ALL > LC_* > LANG
动态库相关
LD_PRELOAD(一般不用)
是一个环境变量,用于动态库的加载,加载时优先级最高。
可以影响程序运行时的链接,允许你自定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,可以再主程序和动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。
一方面,不用修改源代码不用重新编译应用程序,就可以在运行时调整某部分功能。可用来做问题诊断、错误注入测试、数据监控、日志加亮、性能优化以及异常检测等;另一方面,也可以向别人的程序注入程序,从而达到特定的目的(双刃剑)
测试使用
通过自定义 库文件,使ls输出的内容保存到文件中,并且查看时内容有颜色。有无颜色和isatty函数的返回值有关,可使用ltrace查看。
#查看isatty返回值
[root@0524 ~]# ltrace ls > ltrace_ls 2>&1
[root@0524 ~]# grep isatty ltrace_ls
isatty(1) = 0
#生成库文件,定义isatty的返回值为1
[root@0524 ~]# echo 'int isatty(int fd){ return 1;}' | gcc -x c -o libisatty.so -shared -
[root@0524 ~]# ls
env.txt export.txt file1 file2 ltrace_ls test libisatty.so(生成的库文件)
#指定库文件执行命令
[root@0524 ~]# LD_PRELOAD=./libisatty.so ls > file1
#查看文件
[root@0524 ~]# cat file1
env.txt export.txt file1 file2 libisatty.so ltrace_ls test
现在使用cat命令查侃file1文件,文件中目录和库文件都是有颜色的。
LD_LIBRARY_PATH(常用)
也是一个环境文件,主要用于指定查找动态链接库外时除默认路径外的其他路径。
一直程序时经常碰到需要使用一些特定的动态库,而这些编译好的动态库放在我们自己建立的目录里,这时可以将这些目录设置到LD_LIBRARY_PATH中。
ldconfig
位于/usr/sbin/下,他将/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache以供使用。因此当安装完库文件或者修改了/etc/ld.so.conf文件增加了新的路径后,需要运行一下ldconfig命令,使所有的库文件都被缓存到/etc/ld.so.cache中,如果没做,可能会找不到刚安装的库。
默认库文件路径
在没有其他设置的情况下,默认在标准库路径/lib和/usr/lib中搜索库文件。
区别和使用
- 一般情况下,优先级顺序为: LD_PRELOAD > LD_LIBRARY_PATH > /etc/ld.so.cache > /lib > /usr/lib
- 连接器的缺省搜索路径是 /lib 和 /usr/lib
- ld.so.conf 在系统范围内全局有效,而且最好配合ldconfig使用
- LD_PRELOAD与LD_LIBRARY_PATH都是环境变量,更多时候作为一种临时解决方案,在没有权威或临时需要的时候使用。也可以添加至/etc/profile 、 ~/.bashrc等地方使之自行生效并扩大有效范围。