环境变量的设置是每个学习编程的人躲不开的话题,本文尝试理清相关的概念.
我们从命令行想要运行一个程序的时候,待运行的程序往往不是在当前目录。 PATH变量就是用于保存可以搜索的目录路径,如果待运行的程序不在当前目录,操作系统便可以去依次搜索PATH变量变量中记录的目录,如果在这些目录中找到待运行的程序,操作系统便可以运行。
which 命令,它用于查找某个命令所在的绝对路径
chenxiaoyaodeMacBook-Pro:~ chenxiaoyao$ which npm
/Users/chenxiaoyao/.nvm/versions/node/v17.3.1/bin/npm
chenxiaoyaodeMacBook-Pro:~ chenxiaoyao$ which node
/Users/chenxiaoyao/.nvm/versions/node/v17.3.1/bin/node
chenxiaoyaodeMacBook-Pro:uppy chenxiaoyao$ which ls
/bin/ls
通过使用 which 命令,可以查找各个外部命令(和 Shell 内置命令相对)所在的绝对路径。
看到这里,你是否有这样一个疑问,为什么前面在使用 rm、rmdir、ls 等命令时,无论当前位于哪个目录,都可以直接使用,而无需指明命令的执行文件所在的位置(绝对路径)呢?其实,这是 PATH 环境变量在起作用。
/Users/chenxiaoyao/.nvm/versions/node/v17.3.1/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
这里的 echo 命令用来输出 PATH 环境变量的值(这里的 $ 是 PATH 的前缀符号),PATH 环境变量的内容是由一堆目录组成的,各目录之间用冒号“:”隔开。当执行某个命令时,Linux 会依照 PATH 中包含的目录依次搜寻该命令的可执行文件,一旦找到,即正常执行;反之,则提示无法找到该命令。
如果在 PATH 包含的目录中,有多个目录都包含某命令的可执行文件,那么会执行先搜索到的可执行文件。
从执行结果中可以看到,/bin 目录已经包含在 PATH 环境变量中,因此在使用类似 rm、rmdir、ls等命令时,即便直接使用其命令名,Linux 也可以找到该命令。
a. /etc/paths
b. /etc/profile
c. ~/.bash_profile
d. ~/.bash_login
e. ~/.profile
f. ~/.bashrc
/etc/profile 和 /etc/paths 是系统级别的配置文件,后面几个是用户级的配置文件。
文件加载顺序:
系统启动时会按上面罗列的配置文件从上到下的顺序加载。但是,如果 /.bash_profile 文件存在,那么 /.bashrc 会被忽略,如果不存在 ~/.bash_profile 文件,才会按顺序读取后面的文件。/.bash_login、/.profile、
另外,~/.bashrc 文件又比较特殊,这个文件是在 bash shell 打开时才加载的,并不是系统启动后就加载的。
chenxiaoyaodeMacBook-Pro:etc chenxiaoyao$ cat paths
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
以上的配置文件在 bash shell 环境下才有效,在 zsh shell 环境下无效。如果希望在 zsh shell 下可以使用上述配置文件中的环境变量,可以在 ~/.zshenv 或者 ~/.zshrc 文件中添加下面的命令语句:
source /etc/profile
source ~/.bash_profile
打开 zsh shell 时会顺序加载 /.zshenv、/.zshrc 文件,添加上面两条命令语句,则表示加载 ~/.zshenv 或 ~/.zshrc 时会去调用外部脚本文件 /etc/profile 和 ~/.bash_profiel,且被调用的脚本运行结束后,所拥有的环境变量和声明变量会被当前 zsh shell 保留,类似将调用脚本的内容复制过来直接执行,执行完毕后原主 shell 继续运行。所以通过这样的方式就可以使用在 bash shell 环境下配置的环境变量了。
当然你也可以直接将相关的环境变量配置在 ~/.zshrc 文件中,但是显然是多余而且繁琐了,每次你要新增一个环境变量的时候,你都要在 bash shell 有关的配置文件中添加,又要在 zsh shell 有关的配置文件中添加,显然是不合适的。而如果每次加载 ~/.zshrc 文件时会自动调用 bash shell 有关的配置文件,那么所有的环境变量只要在 bash shell 有关的配置文件中添加就可以了。
chenxiaoyaodeMacBook-Pro:etc chenxiaoyao$ export
declare -x NODE_PATH=":/usr/local/lib/node_modules"
declare -x NVM_BIN="/Users/chenxiaoyao/.nvm/versions/node/v17.3.1/bin"
declare -x NVM_DIR="/Users/chenxiaoyao/.nvm"
declare -x NVM_INC="/Users/chenxiaoyao/.nvm/versions/node/v17.3.1/include/node"
declare -x PATH="/Users/chenxiaoyao/.nvm/versions/node/v17.3.1/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
系统环境变量在 /etc/profile 文件中配置,编辑该文件需要 root 权限
用户环境变量可以在 ~/.bash_profile 文件内配置。你可以在命令终端使用 vim 编辑文件:
vim ~/.bash_profile
你也可以使用 macOS 内置的编辑器打开文件,在命令终端输入:
open -e ~/.bash_profile
如果不存在 ~/.bash_profile 文件,这需要自己创建该文件,在终端输入:
touch ~/.bash_profile
最后在命令终端输入 source ~/.bash_profile 使配置立即生效, 这个时候我们就可以使用命令echo $PATH或者查看变量的内容。