这里写目录标题
1.如果要让程序直接输入程序名就能运行,该怎么办?
一个软件需要运行
==>操作系统就必须要找到可执行程序
==>需要在特定的路径下找
==>操作系统启动时默认从配置文件中读取安装过的软件的安装路径
==>操作系统将对应路径导入到内存里构建了一个内存级变量
==>环境变量PATH因此产生(冯诺依曼体系规定,程序需要运行必须先加载到内存。)
当操作系统在启动命令行解释器shell的时候,导入到shell的上下文当中,当我们执行相应的指令时,就必须通过PATH的方式,让系统通过PATH指定的路径去执行对应的可执行程序。并且,操作系统在启动bash为我们做一些命令行解释的时候,必须提前准备一些变量,变量中包含单个或多个程序需要用到的信息,这些变量就是环境变量。
综上:简单来说,环境变量是一堆操作系统为解释命令的变量,其中PATH是记录程序所在完整路径的变量。
a.通过环境变量PATH
export PATH=$PATH:添加的程序所在路径 //:前面$PATH代表原先的添加,:后代表添加程序所在的路径。
echo $PATH //查看系统的所有指令的路径。
#执行的程序的路径都在PATH变量里,我们可以把我们程序的路径放在里面,这种环境变量属于一种内存级变量,重启会恢复。
//env命令 查看系统在启动后默认导入的所有环境变量
//set命令 显示所有的环境变量和本地变量
//unset命令 取消环境变量或者本地变量
//export命令 设置一个新的环境变量,通过这个指令可以将本地变量设置为环境变量。
b.通过添加到指令空间 (不推荐)
我们所用的系统指令文件一般都是在/usr/bin目录下的。我们可以将我们的程序拷贝到系统安装指令的空间/usr/bin中。
但是这种方式非常不推荐,因为我们写的程序没经过测试,可能会污染指令池。所以测试完,记得删除。
2.环境变量添加
配置环境变量(视情况而定,不同操作系统或者不同版本以下文件的文件名不尽相同)
环境变量加载顺序
- /etc/environment
- /etc/profile
- /etc/bashrc
- ~/.profile
- ~/.bashrc
用户级别环境变量配置文件(视情况而定,不同操作系统或者不同版本以下文件的文件名不尽相同)
~/.bashrc
~/.profile
~/.bash_profile(centos7 无)
a.临时设置(只对当前命令终端有效)
# 需要添加到环境变量的程序放在~/bin文件夹
export PATH=~/bin:$PATH
b.当前用户的全局设置
# 打开~/.bashrc,添加行:
export PATH=~/bin:$PATH
source ~/.bashrc //生效
# 在~/.profile 或 ~/.bash_profile添加的话,方法同上
c.所有用户的全局设置
# 打开 /etc/profile,添加行:
export PATH=~/bin:$PATH
source /etc/profile //生效
# 不建议在 /etc/environment中添加
3.用户登录后加载profile和bashrc的流程
用户登录后加载profile和bashrc的流程如下
#用户登录后加载profile和bashrc的流程如下:
1. /etc/profile
->/etc/profile.d/*.sh
2. $HOME/.bash_profile
->$HOME/.bashrc
->/etc/bashrc
说明:
bash首先执行/etc/profile脚本,/etc/profile脚本先依次执行/etc/profile.d/*.sh 。
随后bash会执行用户主目录下的.bash_profile脚本,.bash_profile脚本会执行用户主目录下的.bashrc脚本,而.bashrc脚本会执行/etc/bashrc脚本。
至此,所有的环境变量和初始化设定都已经加载完成.bash随后调用terminfo和inputrc,完成终端属性和键盘映射的设定.
其中PATH这个变量特殊说明一下:(举例)
如果是超级用户登录,在没有执行/etc/profile之前,PATH已经设定了下面的路径:
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
如果是普通用户,PATH在/etc/profile执行之前设定了以下的路径:
/usr/local/bin:/bin:/usr/bin
这里要注意的是:在用户切换并加载变量,例如su -,这时,如果用户自己切换自己,比如root用户再用su - root切换的话,加载的PATH和上面的不一样.
准确的说,是不总是一样.所以,在/etc/profile脚本中,做了如下的配置:
if [ `id -u` = 0 ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
fi