系统级环境变量:每一个登录到系统的用户都能够读取到系统级的环境变量
用户级环境变量:每一个登录到系统的用户只能够读取属于自己的用户级的环境变量
Linux加载环境变量的顺序:
==> /etc/environment(系统级)在系统启动时运行,用于配置与系统运行相关但与用户无关的环境变量
==> /etc/profile(系统级)# 打开/etc/profile文件你会发现,该文件的代码中会加载/etc/bash.bashrc文件,然后检查/etc/profile.d/目录下的.sh文件并加载
==> /etc/bashrc(Ubuntu中是/etc/bash.bashrc)(系统级)
==> /etc/profile.d/*.sh(此项在/etc/profile文件中执行)
==> ~/.bash_profile | ~/.bash_login | ~/.profile # 打开~/.profile文件,会发现该文件中加载了~/.bashrc文件。~/.bash_profile文件只在用户登录的时候读取一次
==> ~/.bashrc # ~/.bashrc在每次打开终端进行一次新的会话时都会读取
==> ~/.bash_logout
系统环境变量 -> 用户自定义环境变量。
在用户环境变量中,系统会首先读取~/.bash_profile(或者~/.profile)文件,如果没有该文件则读取~/.bash_login,根据这些文件中内容再去读取~/.bashrc。
一些小技巧
可以自定义一个环境变量文件,比如在某个项目下定义uusama.profile,在这个文件中使用export定义一系列变量,然后在~/.profile文件后面加上:sourc uusama.profile,这样你每次登陆都可以在Shell脚本中使用自己定义的一系列变量。
也可以使用alias命令定义一些命令的别名,比如alias rm="rm -i"(双引号必须),并把这个代码加入到~/.profile中,这样你每次使用rm命令的时候,都相当于使用rm -i命令,非常方便。
参考: https://zhuanlan.zhihu.com/p/317282094
临时有效的环境变量
此类环境变量只对当前的shell有效,当退出登录或者关闭终端再重新打开时,这个环境变量就会消失,设置方法 export 变量名=变量值,如:export NAME='alan',立即生效。
echo 用于打印显示环境变量,如:echo $NAME
更新环境变量直接重新赋值即可:NAME='ayun' (注意:变量名前不需要加$)
- export显示当前系统定义的所有环境变量
- env 显示当前用户的变量;
- set 显示当前shell变量,shell变量包含用户变量;
- unset 删除一个环境变量,如:unset NAME;
- readonly 设置环境变量只读,如:readonly NAME ,只读变量unset无效。
常用环境变量
PATH 是可执行程序的查找路径,路径之间用冒号分隔
$ echo $PATH 查看当前环境PATH配置了哪些路径
/usr/local/cuda/bin:/opt/ros/kinetic/bin:/home/alan/bin:/home/alan/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/alan/alan_software/arcanist/arcanist/bin/
$ cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
$ cat /etc/profile
运行/etc/profile.d/下的脚本
$ ls /etc/profile.d/
PanMSInit.sh apps-bin-path.sh cedilla-portuguese.sh
appmenu-qt5.sh bash_completion.sh vte-2.91.sh
$ cat /etc/profile.d/apps-bin-path.sh
snap_bin_path="/snap/bin"
export PATH=$PATH:${snap_bin_path}
$ cat ~/.bashrc
export PATH="$PATH:/home/alan/alan_software/arcanist/arcanist/bin/"
export PATH="/usr/local/cuda/bin":$PATH
设置PATH
如果要在任何目录下都能执行某个bin文件夹下的可执行文件,只需要将这个bin路径添加到PATH。
方法一:export PATH=$PATH:xxx,只在当前命令窗口生效,登出后失效。
方法二:修改~/.bashrc或系统级别的/etc/profile
- 在其中添加例如export PATH=xxx:$PATH
- source ~/.bashrc (source命令也称为“点命令”,也就是一个点符号(.),source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
LD_LIBRARY_PATH 环境变量主要是用于指定动态链接器(ld)查找ELF可执行文件运行时所依赖的动态库(so)的路径,路径之间用冒号分隔。
ld链接器将优先在该变量设置的路径中查找,若未找到则在标准库路径/lib和/usr/lib中继续搜索。
一般情况下,只有当程序所需的依赖库不是系统标准安装的库或对库的版本特定要求时,可以指定 LD_LIBRARY_PATH环境变量实现。
通过下面的命令可以查看可执行文件或库文件本身对所依赖的库的情况:
$ ldd /bin/echo
linux-vdso.so.1 => (0x00007ffe553a8000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f113e893000)
/lib64/ld-linux-x86-64.so.2 (0x00007f113ec5d000)
设置LD_LIBRARY_PATH
方法一: export LD_LIBRARY_PATH="xxx":$LD_LIBRARY_PATH,只在当前命令窗口生效,登出后失效。
方法二: 修改 ~/ .bashrc或~/.bash_profile或系统级别的/etc/profile
- 在其中添加例如 export LD_LIBRARY_PATH="xxx":$LD_LIBRARY_PATH
- source ~/.bashrc
方法三:这个没有修改LD_LIBRARY_PATH但是效果是一样的实现动态库的查找,设置稍微麻烦,好处是比较不受用户的限制。
- /etc/ld.so.conf下面加一行/usr/local/mysql/lib
- 保存过后ldconfig一下
ldconfig 命令的用途:
在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表,为了让动态链接库为系统所共享,需运行动态链接库的管理命令ldconfig,此执行程序存放在/sbin
目录下。ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。)
ldconfig几个需要注意的地方:
- 往
/lib
和/usr/lib
里面加东西,是不用修改/etc/ld.so.conf
的,但是完了之后要调一下ldconfig,不然这个library会找不到。 - 想往上面两个目录以外加东西的时候,一定要修改
/etc/ld.so.conf
,然后再调用ldconfig,不然也会找不到。 - 比如安装了一个mysql到
/usr/local/mysql
,mysql有一大堆library在/usr/local/mysql/lib
下面,这时就需要在/etc/ld.so.conf
下面加一行/usr/local/mysql/lib
,保存过后ldconfig一下,新的library才能在程序运行时被找到。 - 如果想在这两个目录以外放lib,但是又不想在
/etc/ld.so.conf
中加东西(或者是没有权限加东西)。那也可以,就是export一个全局变量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时候使用。 - ldconfig做的这些东西都与运行程序时有关,跟编译时一点关系都没有。编译的时候还是该加-L就得加,不要混淆了。
PYTHONPATH 是Python搜索路径,默认我们import的模块都会从PYTHONPATH里面寻找。
设置PYTHONPATH
方法一:export PYTHONPATH=/usr/local/lib/python2.7/dist-packages:$PYTHONPATH。
方法二:修改~/.bash_profile,在其中添加例如 export PYTHONPATH=xxx:$PYTHONPATH,source ~/.bash_profile。
PYTHONPATH 与 sys.path的关系
导入一个叫 mod1 的模块时,解释器先在当前目录中搜索名为 mod1.py 的文件。如果没有找到的话,接着会到 sys.path 变量中给出的目录列表中由左到右查找列表中每个目录。
sys.path 变量的初始值来自如下:
- 输入脚本的目录(当前目录)。
- 环境变量 PYTHONPATH 表示的目录列表中搜索(这和 shell 变量 PATH 具有一样的语法,即一系列目录名的列表)。
- Python 默认安装路径中搜索。
实际上,解释器由 sys.path 变量指定的路径目录搜索模块,该变量初始化时默认包含了输入脚本(或者当前目录), PYTHONPATH 和安装目录。这样就允许 Python程序了解如何修改或替换模块搜索目录。
$ echo $PYTHONPATH
/opt/ros/kinetic/lib/python2.7/dist-packages
>>> import sys
>>> sys.path
['', '/opt/ros/kinetic/lib/python2.7/dist-packages', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/home/alan/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/python2.7/dist-packages/wx-3.0-gtk2']
其他环境变量
echo $HOME # 用户的主工作目录
echo $LOGNAME # 当前用户登入名
echo $HOSTNAME # 主机名称
echo $SHELL # 当前用户使用的shell种类
echo $HISTSIZE # 保存历史命令的条数