Linux 环境变量
一、环境变量
1.1 概念
存储有关 shell 会话和工作环境的信息。这项特性允许在内存存储数据。以便程序或 shell 运行的脚本能够轻松访问它们。
环境变量分为两类:
- 全局变量
- 局部变量
当然,有些人不分类,只把全局环境变量称为环境变量,不把局部环境变量称为环境变量。
1.2 全局变量和局部变量
全局环境变量可以在对其做出定义的父进程所创建的子进程中使用。
局部环境变量只能在定义它们的进程中使用。
1.3 三个对应的命令
命令 | 说明 |
set | 显示当前 Shell 所有变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量(局部变量)及导出的全局环境变量。一般用该命令查看局部环境变量,因为没有查看局部变量的特定命令。 |
env | 显示与当前用户相关的全局环境变量,还可以让命令在指定环境中运行。 |
export | 显示从 Shell 中导出成环境变量的变量,也能通过它将自定义局部变量导出为全局环境变量。 |
运用三个命令来理解全局变量和局部变量:
# 首先在此 shell 中创建一个变量 temp
temp=test # 等号两边不能是空格,即不能是 temp = test
使用 echo 命令可以显示变量的值,但需要在变量前加上 $(有点像 C++ 中的引用)
echo $temp
# 结果是 test
创建一个子 shell,并再次显示变量值
zsh
echo $temp
# 结果为空
结果为空表明该变量只能在在定义它们的进程中使用,此时变量为局部环境变量。
返回到之前的 shell 进程,将并该变量导出为全局环境变量:
exit
export temp
zsh
echo $temp
# 结果为 test
说明此时变量为全局环境变量了。
【注】改变子 shell 中的全局变量不会影响父 shell 中全局变量。即使子 shell 重新定义并导出变量。
1.4 删除环境变量
unset命令。
$ echo $temp
test
$ unset temp
$ echo $temp
$
【注】$ 的使用。如果使用变量,加上 $;如果操作 $,不使用 $。
1.5 设置PATH环境变量
当在 shell 命令行界面中输入一个外部命令时,shell 必须搜索系统来找到对应的程序。PATH 环境变量定义了用于进行命令和程序查找的目录。
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:
/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
输出显示了 8 个可供 shell 用来查找的命令和程序。PATH中的目录使用冒号分隔。
如果命令或程序的位置没有在 PATH 变量中,那么若不使用绝对路径的话,shell 是没法找到。
$ PATH=$PATH:/home/shiyanlou/mybin
使用上述命令可以把 mybin 目录添加至 PATH。冒号后跟的是绝对路径。
此时在命令行中可运行 mybin 中的命令或程序。
# hello_world.c 在 mybin 目录内,hello_world.c已编译为 hello_world
# 将 mybin 添至 PATHhello_woeld 前
$ hello_world
-bash: hello_world.c: command not found
# 将 mybin 添至 PATHhello_woeld 后
$ hello_world
hello world!
程序员通常将单点符也加入 PATH 中。该单点符代表当前目录
$ PATH=$PATH:.
$ cd /home/shiyanlou/mybin
$ hello_world
hello world!
1.6 定位系统环境变量
在登入 Linux 启动一个 bash shell 时,默认情况下 bash 会在几个文件中查找命令,这些文件叫作启动文件或环境文件。而这些启动文件取决于启动 bash 的方式。
启动 bash 的方式:
- 作为默认登录 shell
- 作为非登录 shell 的交互式 shell
- 作为运行脚本的非交互 shell
1.6.1 登录 shell
此种启动方式有 5 种不同的启动文件:
- /etc/profile
- $HOME/.bash_profile
- $HOME/.bashrc
- $HOME/.bash_login
- $HOME/.profile
/etc/profile是默认的 bash shell 主启动文件;
剩下的启动文件都起一个作用:提供一个用户专属的启动文件来定义该用户所用到的环境变量。
另外两种方式以后再说,有些东西是以后的知识。
1.6.4 环境变量持久化
- 将新的或修改的变量放在 /etc/profile 文件中(但若升级该发行版,该文件也会更新)
- 在 /etc/profile.d 目录中创建一个以 .sh 结尾的文件