LInux环境变量的那些事

我们日常做开发的时候,经常遇到环境变量的配置,网上的教程往往总是教你做,却不告诉你为什么

那么环境变量到底是个什么东西?

LInux系统配置文件夹

多用户配置

在unix-like系统中,系统配置文件都被放在一个叫/etc的目录下。里面文件有很多,我们重点关注两类文件。

cd /etc
ls *profile #这类文件里的配置信息会在用户登录时运行
# output: 
# profile zprofile
ls *shrc	#这类文件里的配置信息会在shell被启动时运行
# output: 
# bashrc csh.cshrc zshrc

profilezprofile - 用户登录时运行
bashrczshrc - 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。

发布了43 篇原创文章 · 获赞 20 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_33384402/article/details/104932582