我们日常做开发的时候,经常遇到环境变量的配置,网上的教程往往总是教你做,却不告诉你为什么。
那么环境变量到底是个什么东西?
LInux系统配置文件夹
多用户配置
在unix-like系统中,系统配置文件都被放在一个叫/etc
的目录下。里面文件有很多,我们重点关注两类文件。
cd /etc
ls *profile #这类文件里的配置信息会在用户登录时运行
# output:
# profile zprofile
ls *shrc #这类文件里的配置信息会在shell被启动时运行
# output:
# bashrc csh.cshrc zshrc
profile
、zprofile
- 用户登录时运行
bashrc
、zshrc
- shell启动时运行
除此之外,还有一点,因为是在/etc
文件夹下,所以这些配置信息是针对全部用户的。
那固然好,很方便,但是正因为如此,所以非常不安全。
单用户配置
所以.bashrc
和.bash_profile
诞生了。他们是在用户的根目录下,是只针对单个用户的配置文件。
cd ~ #回到用户根目录
ls .*profile
# output:
# .bash_profile
ls .*shrc
# output:
# .zshrc
这些文件不是一安装系统就有的,第一次需要你自己创建,也不是必须的。
我这里给bash创建了profile,而给zsh创建了shrc,其他没创建。
值得注意的是,.bash_profile
在默认状态下,还会执行.bashrc
。
环境变量
总结
以bash为例。
- 操作系统启动的时候,
/etc/profile
被调用,然后/etc/profile
调用/etc/bashrc
。 - 用户启动shell的时候,
~/.bash_profile
被调用,然后~/.bash_profile
调用~/.bashrc
玩转环境变量
PATH的格式
全文重点
环境变量,就是保存了可执行文件的一个路径集合,用PATH
来表示。
赋值形式:
PATH=[路径1]:[路径2]:[路径3]...
以:
分隔路径,但是思考一个问题,如果我们把一个新的路径赋值给PATH,那么原来保存在PATH中的值是不是会覆盖掉?
是的,所以我们一般在写这个形式的赋值语句时还会又一个潜规则。
PATH=$PATH:[路径2]:[路径3]...
PATH=[路径1]:$PATH:[路径3]...
PATH=[路径1]:[路径2]:$PATH...
$PATH
代表了PATH的值,我们需要把原来的值作为一个路径也加到新的PATH值中,相当于一个+=
的操作。
echo命令
echo命令就是shell中的输出命令,比如我们可以打印以下环境变量:
echo $PATH
你应该会得到一串用冒号分割的字符串,这也印证了我们上面的分析。
export命令
export命令就是设置环境变量。分两个场景来看:
- 在命令行下
在命令行下的export的作用域只有在这次登录期间,也就是说shell一旦退出,设置的环境变量就消失了,那么我们怎么才能够让export的环境变量不消失呢? - 在配置文件中
如果仔细看过上面的分析,就会知道配置文件是在shell登录时候自动加载的,那么我们放到配置文件中,不就解决了这个问题?
比如,我想要配置Maven,我使用的是zsh,那么就在~/.zshrc
的文件中这样写::
# maven setting
export M2_HOME=/usr/local/etc/maven/apache-maven-3.6.3
export M2=$M2_HOME/bin
export PATH=$M2:$PATH
source命令
配置完了信息,我希望配置文件快点生效,但是配置文件只有在登录的时候才生效啊?
没关系,source命令可以立刻应用配置文件的内容,比如,配置完上面的内容,使用source:
source .zshrc
alias命令
OK,前面实在是太麻烦了,那么有没有简单一点的方法?
有,那就是alias,alias的格式为alias [command]=[path]
。
当我们在命令行中输入command,alias会帮我们替换成path。
举个alias的例子,设置mysql的环境变量:
# mysql
alias mysql=/usr/local/mysql/bin/mysql
这样之后,我们每次用mysql的命令,就会被替换成/usr/local/mysql/bin/mysql
。
alias与export的不同
不同于export,export是设置一个环境变量,往往后面的环境变量值是一个路径的集合,也就是一个文件夹,而alias中的path是指定二进制文件。
意思就是说,export导入的可能不止一个命令,我们可以把命令全放一个目录,然后导入,而alias是指定特定的命令由谁来执行,这个’谁’是单个具体的可执行文件。
alias略微简洁明了一点,但其实优势并不是很大,一般都推荐用export。