Linux 环境变量的那些事

想要更好的阅读体验,可以转我的个人博客: nonlinearthink

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

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

环境变量

打印环境变量

什么是环境变量?

env

这个命令可以打印出所有的环境变量。

环境变量就是程序运行的一系列环境参数。

打印单个环境变量

echo $PATH
echo $SHELL
echo $HOME
echo $LOGNAME

这是几个比较常见的环境变量。

变量名说明
PATHshell将会去这里搜寻命令和程序
SHELL当前使用的shell类型
HOME当前用户的根目录
LOGNAME当前用户的登录名

定义环境变量

这是 Go 语言的一个环境变量配置。~/.bashrc 中添加下面几行。

export GOROOT=/usr/local/Cellar/go/1.13.5/bin

保存退出后,就可以使用 echo $GOROOT 打印出来了。

更改环境变量的值

有一个比较特殊的环境变量 $PATH,它的特殊性在于它事实上的意思是可执行文件的一个路径集合,既然是集合就可以被不断添加。

$PATH: 分割,大概就是 path/to/first:path/to/second 这样的形式。

export PATH=$PATH:$GOROOT/bin

上面的命令干了什么呢?

其实,他是做了一个 += 操作。也就是在原先的 $PATH 的基础上加上了 $GOROOT/bin

$GOROOT 就是上面定义的。


Shell 配置文件

多用户配置

在 unix-like 系统中,系统配置文件都被放在一个叫 /etc 的目录下。我们今天的主角是其中的 shell 配置文件。

shell 配置文件可以分为两类: *profile*shrc

*profile 中的内容会在用户登录时被运行。

*shrc 会在 shell 启动时被运行。

从生命周期的角度讲,写在 *profile 中的环境变量的生命周期是整个系统运行期间,而 *shrc 仅仅在 shell 被启动的时候才有效。

生命周期长不一定好,因为我们可能不希望操作系统做太多的初始化而导致开机变慢,所以大部分我们用户自定义的环境变量都是在 *shrc 中。

但是有些软件,需要他们一开机就运行,比如输入法,就需要写在 *profile 中。

cd /etc
ls *profile
# output:
# profile zprofile
ls *shrc
# output:
# bashrc csh.cshrc zshrc

因为我安装了 zsh,所以多了 zprofilezshrc,没安装过其他的 shell,只有默认的 bash 的话,应该只有 profilebashrc

除此之外,忘记说了一点,/etc 文件夹下的配置是针对全部操作系统的用户的。

单用户配置

上面说了多用户的环境变量配置,单用户的配置应该使用.bashrc.bash_profile,它们在用户的根目录(~)下,默认是不创建的,如果需要则自己创建。

cd ~
ls .*profile
# output:
# .bash_profile
ls .*shrc
# output:
# .zshrc

我这里给 bash 创建了 profile,而给 zsh 创建了 shrc,其他没创建。

值得注意的是,.bash_profile 在默认状态下,还会执行 .bashrc


环境变量的优先级

如果在 etc/profile 中和 ~/.bash_profile 都定义了相同的名字的环境变量,会发生什么?

这是一个有趣的问题,我们可以从配置文件被加载的顺序来考虑。

以 bash 为例。

  • 操作系统启动的时候,/etc/profile 被调用,然后 /etc/profile 调用 /etc/bashrc
  • 用户启动 shell 的时候,~/.bash_profile 被调用,然后 ~/.bash_profile 调用 ~/.bashrc

最后被调用的自然会覆盖前面被调用的。

那么这个问题的也就明确了。


补充

export 命令

export 命令就是设置环境变量。分两个场景来看:

  • 在命令行下

    在命令行下的 export 的作用域只有在这次登录期间。

    也就是说 shell 一旦退出,设置的环境变量就消失了。

    如果想要它一直存在,就要写到配置文件中。

  • 在配置文件中

    如果仔细看过上面的分析,就会知道配置文件是在 shell 登录时候自动加载的。

    自然就不会消失了。

source 命令

配置文件写入之后,环境变量不会马上更新。

source 命令可以加载一次配置文件的内容。

比如,配置完上面的内容,使用 source

source .zshrc

alias 命令

alias 就是别名,也就是为命令创建一个别名。

比如,在 linux 中,python 往往默认是 python2

使用 alias 可以设置成 python3

alias python=python3

alias 也可以当成 export 用。

区别在于,export 可以直接导入一个文件夹下面的全部可执行文件。

使用 alias 的还,你可能需要一个个精准定位了。

alias mysql=/usr/local/mysql/bin/mysql

这样之后,我们每次用 mysql 的命令,就会被替换成 /usr/local/mysql/bin/mysql

alias 略微简洁明了一点,但其实优势并不是很大,一般都推荐用 export

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真实的hello world

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值