
环境变量可以帮助提升你的Shell体验。很多程序和脚本都通过环境变量来获取系统信息,存储临时数据和配置信息。
bash使用环境变量( environment variables)来存储有关shell会话和工作环境的信息。这项功能允许你在内存中存储数据,以便程序或shell脚本能够轻松访问。这是存储持久数据的一种简便方法。bash的环境变量分为两类:全局变量和局部变量。
补充:bash使用一致的专有环境变量,但是不同发行版的linux可能会添加自己的环境变量,本博客使用的发行版为Ubuntu 16.04.5 Gnome。
全局变量对于shell会话和所有生成的子shell都是可见的。全局环境变量有助于子shell获取父shell信息。
在Linux中有四个命令可以帮助我们查看所有的环境变量,printenv、env、set、declare。
使用set命令时会一起显示之前定义的函数,仅显示变量可以使用如下命令:
局部变量只能在定义它们的进程中可见,Linux也有默认定义的标准局部环境变量。你也可以自己定义局部环境变量,称为用户定义局部变量。
set命令会显示某个特定进程的所有环境变量,包括局部变量、全局变量以及用户定义变量。
补充:set、env、printenv之间的区别很细微。set命令会显示出所有变量,并且按照字母顺序排序。env和printenv输出相同,但是仅含有全局变量,并且未对变量排序。
设置局部用户定义变量,就是之前002一节提到的变量。
注意:一般bash的环境变量都是使用的大写字母,建议自己的变量名为小写,避免产生冲突。
设置全局环境变量
先创建一个局部环境变量,然后使用export命令将其导出到全局变量。
使用unset命令,格式unset varname
注意:在子shell中删除全局环境变量不会影响到父shell的全局环境变量。
HOME:当前用户的主目录
IFS:shell用来将文本字符串分割成字段的一系列字符
PATH:shell用来查找命令的目录列表。当你输入一个命令时,shell会按照这个目录遍历寻找。
在登录系统启动一个bash shell时,默认情况下bash会在几个文件中查找命令。这些文件叫做启动文件或者环境文件。bash检查的启动文件取决于启动bash的方式:
登录Linux系统是,bash作为登录shell启动。登录shell会一次从以下几个启动文件中读取命令。
/etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都是执行这个文件。
注意: 某些Linux发行版使用了可拆卸式认证模块(PAM)。这时,PAM文件会在bash启动前处理,这些文件可能会包含环境变量。PAM文件包括/etc/environment和$HOME/.pam_environment文件。
我们这里来查看一下/etc/profile文件的内容,学了之前的内容的话,这个文件很容易理解。
$HOME目录下的启动文件
剩下的启动文件都启着同一个作用:提供一个用户专属的启动文件来定义该用户所用到的环境变量。一般Linux发行版只有到下面这四个启动文件中的一两个。
这里列出Ubuntu的启动文件:
可以看到这里只有.bashrc和.profile两个文件。
shell会按照以下顺序执行启动文件,找到第一个其他的就会被忽略。
注意:这里没有$HOME/.bbashrc,因为该文件是通过上面三个文件中的一个运行的。
我们来查看一下.profile文件,.bashrc文件请自行查看。
注意:这里会检查当前运行的shell是否是bash,如是的话,检查是否存在$HOME/.bashrc,若存在则加载该文件。
交互式shell不是登录系统时启动的,它可能是你打开终端启动的。交互式shell不会访问/etc/profile文件,而是只会检查用户HOME目录中的.bashrc文件。
执行shell脚本是的非交互式shell。脚本能以不同的方式执行,可以启动子shell执行,也可以在当前shell中执行。
bash提供了一个BASH_ENV的环境变量,当shell启动一个非交互式shell进程时,它会检查这个环境边浪来查看要执行的启动文件。若有指定的文件,则shell会执行该文件。Ubuntu未设置该变量。
若BASH_ENV未设置,那么非交互式shell如何获得环境变量呢?对于以子shell进程执行的情况,子shell会继承父shell导出的变量(export)。对于在当前shell中执行的情况,变量即为当前shell的变量。
经常遇到安装了一个工具之后,直接输入命令找不到,需要进入相应的bin目录下通过./xxx的方式运行。主要是找不到路径的原因,可以通过设置环境变量的方式解决(原文地址: MAC 设置环境变量path的几种方法 ):
mac 一般使用bash作为默认shell
Mac系统的环境变量,加载顺序为:
/etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc
当然/etc/profile和/etc/paths是系统级别的,系统启动就会加载,后面几个是当前用户级的环境变量。后面3个按照从前往后的顺序读取,如果~/.bash_profile文件存在,则后面的几个文件就会被忽略不读了,如果~/.bash_profile文件不存在,才会以此类推读取后面的文件。~/.bashrc没有上述规则,它是bash shell打开的时候载入的。
如果没特殊说明,设置PATH的语法都为:
#中间用冒号隔开
export PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:------:<PATH N>
(一)全局设置
下面的几个文件设置是全局的,修改时需要root权限
1)/etc/paths (全局建议修改这个文件 )
编辑 paths,将环境变量添加到 paths文件中 ,一行一个路径
Hint:输入环境变量时,不用一个一个地输入,只要拖动文件夹到 Terminal 里就可以了。
2)/etc/profile (建议不修改这个文件 )
全局(公有)配置,不管是哪个用户,登录时都会读取该文件。
3)/etc/bashrc (一般在这个文件中添加系统级环境变量)
全局(公有)配置,bash shell执行时,不管是何种方式,都会读取此文件。
4)
1.创建一个文件:
sudo touch /etc/paths.d/mysql
2.用 vim 打开这个文件(如果是以 open -t 的方式打开,则不允许编辑):
sudo vim /etc/paths.d/mysql
3.编辑该文件,键入路径并保存(关闭该 Terminal 窗口并重新打开一个,就能使用 mysql 命令了)
/usr/local/mysql/bin
据说,这样可以自己生成新的文件,不用把变量全都放到 paths 一个文件里,方便管理。
(二)单个用户设置
1)~/.bash_profile (任意一个文件中添加用户级环境变量)
(注:Linux 里面是 .bashrc 而 Mac 是 .bash_profile)
若bash shell是以login方式执行时,才会读取此文件。该文件仅仅执行一次!默认情况下,他设置一些环境变量
设置命令别名alias ll=’ls -la’
设置环境变量:
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
2)~/.bashrc 同上
如果想立刻生效,则可执行下面的语句:
$ source 相应的文件
一般环境变量更改后,重启后生效
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)