Kali linux 环境变量详解
1. 前言
环境变量(即 Environment variables)顾名思义就是存储环境参数的变量,类似我们编程时会定义变量来存储数据一样,只不过环境变量存储的不是普通的算数数值,而是供操作系统使用的环境参数,环境变量一般会包含一个或者多个应用程序所使用到的信息。
环境变量不是 Linux 系统特有的产物,实际上对于大多数人来说可能不了解 Linux 的环境变量,但一定熟知 Windows 系统的环境变量 ,其中就包含大名鼎鼎的环境变量 PATH
。
2. 作用
环境变量是操作系统中的一种特殊的变量,它们用于存储关键的系统信息,并且可以被系统和应用程序所访问。环境变量存储了一些系统和用户的参数,例如系统目录路径,用户目录路径,程序的安装路径等信息,这些信息有助于操作系统和应用程序之间的便捷交互,具体如下。
(1) 提供系统和用户的参数信息,如路径,版本号等。
(2) 简化操作,便于用户直接在命令行中使用某些命令和程序。
(3) 为系统和应用程序提供配置信息,方便系统和应用程序的调用和使用。
(4) 方便系统管理,使得管理员可以轻松地配置和管理系统。
例如对于 path
环境变量,当你使用命令让系统运行一个程序却没有指定程序所在的路径时,系统会在当前目录寻找程序,如果无法找到则转到 path
变量指定的路径中查找,这便于我们使用终端运行一些程序时不需要在终端输入程序所在目录,后面我们着重来了解 Linux 系统的环境变量。
3. 分类
Linux 中的环境变量和 Windows 系统一样分为两类,用户环境变量 和 系统环境变量,毕竟 Linux 系统和 Windows 系统都属于多用户系统,所以用户环境变量可以隔离每个用户的变量参数,防止遭到其他用户的破坏,还能防止环境变量滥用。
Linux 的环境变量具有时效性,环境变量可以设置为 永久的 或 临时 的。当在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效。当在当前终端下声明环境变量,关闭 Shell 终端后就失效,这就是临时的。
4. 命令
我们使用 Windows 系统一般通过图形化的环境变量管理器来修改,添加环境变量,在 Linux 系统中则需要通过专有命令与修改配置文件的形式来管理环境变量。
下面先来了解一下环境变量相关的命令使用。
(1) 设置或显示环境变量命令 export
。
export[变量名称]=[变量值]
,创建一个指定的环境变量,export 的具体作用是将一个变量的值传递给子进程,当一个变量被 export 后,就变为全局变量,可以被当前 Shell 及其子进程所访问。
选项:
-f
,代表 [变量名称]
为函数名称,使用该选项还可以在变量名称处指定函数。
-n
,删除指定的环境变量,实际上环境变量未删除,只是不再生效。
-p
,列出所有的 Shell 赋予程序的环境变量,实际不指定该选项直接执行 export 命令也可以。
例如:
zhbi98@kali:~/Desktop$ export -p
declare -x HOME="/home/zhbi98"
declare -x LANG="en_US.UTF-8"
declare -x LOGNAME="zhbi98"
declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/arm-linux-gcc-eabi/bin"
declare -x PWD="/home/zhbi98/Desktop"
declare -x USER="zhbi98"
declare -x USERNAME="zhbi98"
(2) 显示所有已定义的环境变量命令 printenv
。
仅用于查看环境变量。
(3) 显示指定的环境变量命令 printenv [环境变量名称]
。
仅用于查看环境变量。
(4) 显示所有已定义的环境变量命令 env
。
仅用于查看环境变量。
(5) 显示指定的环境变量 echo ${[环境变量名称]}
。
仅用于查看环境变量。
5. 环境变量配置
配置环境变量我们一般使用 export
命令,而配置文件则根据不同的用途具有不同的配置文件,我们选择其中一个合适的配置文件添加我们的环境变量即可。
下面我们来详细了解一下各种方法及区别,例如在这里我们要将一个 GCC 程序目录 /usr/local/arm-linux-gcc-eabi/bin
添加到 Linux 环境变量 PATH
中,方便在终端中调用 GCC。
注意:Linux 中一个环境变量名可以包含多个变量值,同时每个变量值之间需要使用冒号 :
进行分隔。
5.1 在终端直接修改
直接在当前终端使用 export 命令修改 PATH
的值,将我们的程序目录追加到变量 PATH
中,如下。
export PATH=$PATH:/usr/local/arm-linux-gcc-eabi/bin
修改后该变量立即生效,但是仅对当前用户,当前终端有效,所以当前终端关闭后变量失效。
5.2 修改 .bashrc 文件
.bashrc
文件是 Bash shell 的配置文件之一,文件位于 ~/.bashrc
,它存储了用户定义的环境变量,别名,函数等 Bash shell 的配置信息。当用户登录到一个 Bash shell 时,它会自动执行 .bashrc 文件中的命令,以设置用户的环境。
.bashrc
文件是一个隐藏文件,通常位于用户的 home/
目录下。用户可以使用任意文本编辑器打开并修改该文件。例如在 .bashrc
文件中添加自己的自定义命令,别名,函数等,以方便自己的使用。
它们会在每次启动 Bash shell 时自动加载,通过修改用户目录下的 .bashrc
文件可以配置环境变量,如下。
(1) 执行目录切换命令到文件所在目录,如果文件不可编辑,需要修改文件权限为可写,再执行。
ls -a # 执行该命令可以使你看见该隐藏文件
vim .bashrc
(2) 在文件已有内容的最后一行加上待添加路径,如下。
export PATH=$PATH:/usr/local/arm-linux-gcc-eabi/bin
在相同的用户下打开新的终端时生效,或者手动在终端执行 source .bashrc
命令生效,但是仅对当前用户有效,且是永久有效的。
如果有后续的环境变量加载该文件并覆盖了 PATH
内容,则可能不再生效。
5.3 修改 .bash_profile 文件
.bash_profile
(一些发行版命名为 .profile
)是 Bash shell 的配置文件,文件位于 ~/.bash_profile
,它们会在每次启动 Bash shell 时自动加载。通过修改该文件可以配置环境变量,效果和 .bashrc
类似。
(1) 执行目录切换命令到文件所在目录,如果文件不可编辑,需要修改文件权限为可写,如果没有 .bash_profile
文件,则可以自己新建一个,再执行。
ls -a # 执行该命令可以使你看见该隐藏文件
vim .bash_profile
(2) 在文件已有内容的最后一行加上待添加路径,如下。
export PATH=$PATH:/usr/local/arm-linux-gcc-eabi/bin
在相同的用户下打开新的终端时生效,或者手动在终端执行 source .bash_profile
命令生效,但是仅对当前用户有效,且是永久有效的。
5.4 修改 bashrc 文件
该方法是修改系统配置,文件位于 /etc/bashrc
,修改需要管理员权限(如 root 权限)。
(1) 执行目录切换命令到文件所在目录,如果文件不可编辑,需要修改文件权限为可写,再执行。
chmod -v u+w bashrc
vim bashrc
(2) 在文件已有内容的最后一行加上待添加路径,如下。
export PATH=$PATH:/usr/local/arm-linux-gcc-eabi/bin
打开新的终端时生效,或者手动在终端执行 source bashrc
命令生效,对系统所有用户有效,且是永久有效的。
5.5 修改 profile 文件
这些文件是系统级别的 shell 配置文件,文件位于 /etc/profile
(一些发行版命名为 bash_profile
),它们会在用户登录时自动加载。在这些文件中,可以使用 export 命令或直接将变量名和值写在一行中来设置环境变量。
(1) 执行目录切换命令到文件所在目录,如果文件不可编辑,需要修改文件权限为可写,再执行。
chmod -v u+w profile
vim profile
(2) 在文件已有内容的最后一行加上待添加路径,如下。
export PATH=$PATH:/usr/local/arm-linux-gcc-eabi/bin
打开新的终端时生效,或者手动在终端执行 source profile
命令生效,对系统所有用户有效,且是永久有效的。
5.6 修改 environment 文件
这个文件是系统级别的环境变量配置文件,文件位于 /etc/environment
,它会在系统启动时自动加载,在这个文件中,可以直接将变量名和值写在一行中来设置环境变量,但一般不在该文件定义环境变量,也希望不要轻易的修改此文件。
(1) 执行目录切换命令到文件所在目录,如果文件不可编辑,需要修改文件权限为可写,再执行。
chmod -v u+w environment
vim environment
(2) 在文件已有内容的最后一行加上待添加路径,如下。
export PATH=$PATH:/usr/local/arm-linux-gcc-eabi/bin
打开新的终端时生效,或者手动在终端执行 source environment
命令生效,对系统所有用户有效,且是永久有效的。
5.7 总结
系统级别的配置文件,对 Linux 系统的所有用户生效,用户级别的配置文件,只对当前用户生效。在这些文件中设置的环境变量会被系统或用户的 Shell 所加载,并可供给后续的命令或程序使用。
(1) 系统级环境变量配置文件:/etc/environment
,/etc/profile
,/etc/bashrc
。
(2) 用户级环境变量配置文件:~/.bashrc
,~/.bash_profile
。
6. 加载顺序
前面讲解了在 5 种配置文件中修改定义环境变量的方法,此时你肯定会考虑你的环境变量该在哪个文件中定义。
实际上在哪个文件定义环境变量都是等价的,都可以生效,但是定义在不同文件的区别是变量被执行的顺序,换而言之就是这些配置文件在 Linux 系统启动时不是同时被加载的,而是按照一定的顺序依次被系统或 Shell 加载。
6.1 登录 Shell 非登录 Shell
在了解配置文件加载顺序之前我们先来回顾一下登录 Shell 和交互式非登录Shell。
登录 Shell 是指用户登录系统时,由系统默认启动的 Shell(就是 Linux 刚启动时用于输出启动信息,或让你输入用户名密码登录的 Shell),通常为 bash,在这个Shell 环境中,会执行一些系统级别的配置文件,比如 /etc/profile 文件和~/.bash_profile 文件等,用来设置全局的环境变量和别名等。
交互式非登录 Shell 是指用户在登录系统后,手动启动的新 Shell,比如在终端命令行中输入 bash 或者 sh 等命令,或在 GNOME 或 KDE 中打开一个 Terminal 窗口,这种 Shell 不会执行系统级别的配置文件,而是执行用户级别的配置文件,比如 ~/.bashrc 等。
6.2 配置文件加载顺序
当 bash 是以登录 Shell 方式执行时,需要加载系统级配置文件,读取 /etc/profile,再次读取 etc/profile.d,~/.bash_profile 若这两个文件不存在,则读取 ~/.bash_login 若不存在则读取 ~/.profile 文件,一般情况下如若当前加载文件不存在则忽略以加载下一个文件。
当 bash 是以交互非登录 Shell 形式执行时,读取 ~/.bashrc 文件。
按照 Shell 类型的不同,配置文件加载顺序也不同,具体加载顺序如下图:
Linux Start
/\
/ \
/ \
(Shell) (Login Shell)
| |
| etc/profile (bash_profile)
| |
| etc/profile.d
| |
| ~/.bash_profile (.profile)
| |
| ~/.bash_login
| |
| ~/.profile
| |
+—————> ~/.bashrc
总结来说,图中右侧流程用于登陆 Shell,左侧流程用于交互式非登陆 Shell 。简单说来,右侧流程在每次登录时被执行的,左侧在新启动一个命令行窗口时被执行。