变量是计算机系统用于保存可变值的数据类型。在Linux系统中,变量名称一般大写,命令则一般小写。Linux系统中的环境变量是用来定义系统运行环境的一些参数,每个用户的家目录就是通过环境变量定义的。需要使用到变量值的时候,通过变量名称就可以直接获取到对应的变量值。
如下:
afei@ubuntu:~$ ls $HOME
Desktop Downloads Music progress.text Templates Videos
Documents file.text Pictures Public test.text workspace
afei@ubuntu:~$
afei@ubuntu:~$ echo $HOME
/home/afei
为了更好的理解环境变量,我们先老看一看用户执行了一条命令之后,Linux系统是怎么去执行它的,命令在Linux中的执行有4个步骤。
第1步:判断用户输入的命令是否是带绝对路径的,(如/bin/echo),如果是绝对路径则直接执行,否则进入第2步。
第2步:Linux系统检查用户输入的命令是否为“别名命令”,即是否是用户为原命令定义的命令别称。
为防止用户误删除文件,Linux 可以将 “ rm -i ” 的别名设置为 rm 那么在执行 rm 的时候,默认就是带了 -i 参数的 rm 命令。
第3步:Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;如果是外部命令,这些命令会被交由步骤4继续处理。可以使用“type命令名称”来查看用户输入的命令是内部命令还是外部命令:
afei@ubuntu:~$ type echo
echo is a shell builtin
afei@ubuntu:~$
第4步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,作用是告诉Bash解释器待执行的命令可能存放的位置,Bash 解释器会在 PATH 变量中的这些位置查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找。
afei@ubuntu:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
afei@ubuntu:~$
如上,当用户执行外部命令的时候,系统会在这些位置去查找我们执行的命令,找到的话就开始执行
常用的几个环境变量:
变量名称 | 作用 |
HOME | 用户的主目录(即家目录) |
SHELL | 用户在使用的Shell解释器名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
| 邮件保存路径 |
LANG | 系统语言、语系名称 |
RANDOM | 生成一个随机数字 |
PS1 | Bash解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
设置环境变量的几种方式:
使用 export 设置临时的环境变量。
这种变量只在当前终端能发挥作用,当关闭终端的时候,变量就自动销毁了,如果要使用,那就需要再次使用 export 进行设置:
昨天介绍原字符的时候有这样一个例子:
afei@ubuntu:~$ export name=afei
afei@ubuntu:~$ echo $name
afei
afei@ubuntu:~$
又或者,我们可以将一个路径保存到变量里面,方便使用
afei@ubuntu:~$ export WORKDIR=/home/afei/workspace/
afei@ubuntu:~$
afei@ubuntu:~$ cd $WORKDIR
afei@ubuntu:~/workspace$
编辑用户家目录下的 .bashrc 文件来配置用户专有的变量
这个变量只在当前用户登录系统的时候才有效,因为系统每次登录进入的时候,都会加载当前用户家目录下的 .bashrc 文件
afei@ubuntu:~$ vim .bashrc
编辑家目录下的 .bashrc 文件,加入变量 NAME= afei-test
afei@ubuntu:~$ source .bashrc
使修改后的 .bashrc 文件生效
afei@ubuntu:~$
afei@ubuntu:~$ echo $NAME
afei-test
afei@ubuntu:~$
编辑 /etc/profile 设置对所有用户都生效的环境变量
root@ubuntu:/home/afei# vim /etc/profile
切换到 root 用户,编辑 /etc/profile ,添加变量
NAME=afei-test/etc/profile
root@ubuntu:/home/afei#
root@ubuntu:/home/afei# source /etc/profile
使修改后的 /etc/profile 文件生效
root@ubuntu:/home/afei# echo $NAME
afei-test/etc/profile
root@ubuntu:/home/afei#
现在设置的变量,是对所有用户生效的,所有用户都可以访问到这个变量。
但是如果当前用户下设置了一个和 NAME 同名的变量,那么系统会优先读取当前用户下设置的变量。