Linux 环境变量的那些事

# 环境变量

# 打印环境变量

环境变量就是程序运行时的一系列静态参数,程序在运行时无法修改。

想要查看所有环境变量,可以使用这个命令:

1
env

# 打印单个环境变量

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

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

# 定义环境变量

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

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

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

在一个目录下创建 .env 文件,并写入:

1
GOROOT /usr/local/Cellar/go/1.13.5/bin

可以让这个环境变量仅对在当前目录下运行的应用程序生效。

# 更改环境变量的值

有一个比较特殊的环境变量 $PATH,它是环境变量的一个路径集合,既然是集合就可以被不断添加。

$PATH: 分割,以 path/to/first:path/to/second 这样的形式存在。

1
export PATH=$PATH:$GOROOT/bin

上面的命令相当于执行了一个 += 操作。也就是在原先的 $PATH 的基础上加上了 $GOROOT/bin


# Shell 配置文件

# 多用户配置

在 unix-like 系统中,系统配置文件都被放在一个叫 /etc 的目录下。其中也包含了 shell 配置文件。

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

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

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

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

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

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

1
2
3
4
5
6
7
cd /etc
ls *profile
# output:
# profile zprofile
ls *shrc
# output:
# bashrc csh.cshrc zshrc

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

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

# 单用户配置

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

1
2
3
4
5
6
7
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

1
source .zshrc

# alias 命令

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

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

使用 alias 可以设置成 python3

1
alias python=python3

alias 也可以当成 export 用。

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

alias 只能针对一个可执行文件,需要你一个一个写。

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

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

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

使用 Hugo 构建
主题 StackJimmy 设计