1、在Linux中,输入命令的时候,我们可以输入一半按Tab进行命令补全
2、但问题是,为何按Tab键就能进行命令补全呢?这里涉及到$PATH环境变量
3、什么是$PATH环境变量
$PATH是一个环境变量,它定义了系统中可执行文件的搜索路径;
所以每当我们在输入命令按Tab键补全的时候,Bash就会根据$PATH中定义的目录依次搜索可执行文件
4、查看$PATH目录
echo $PATH
命令输出结果如下:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
这上面的的路径使用:进行分割,依次展开就是
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin
当我们想要输入cat命令的时候,我们在终端上只输入ca然后按Tab键进行补全;
当按Tab那一刻,bash就会根据$PATH定义的目录依次从头开始找是否有cat这个可执行文件;
所以先从/usr/local/sbin找,如果第一个没找到,就去第二个/usr/local/bin找;
一直到最后一个,如果到最后一个也没有,那么按Tab键也没用,不会进行任何显示
这就是为何按Tab能够补全命令的原因
如果我们后续安装了一些管理类的命令,也想直接在全局路径下去使用,可以将这些工具的可执行目录追加到$PATH路径中,这样我们在任意位置按Tab键也可以进行自动补全,下面是如何设置的步骤
5、只对当前shell会话生效
以nginx命令为例,假设nginx的可执行文件的路径是/usr/local/nginx/sbin;
我们想在系统的任意位置都想要使用/usr/local/nginx/sbin下的命令,可以这样做
1、修改$PATH的环境变量,这里的修改其实是直接修改PATH变量的值
PATH=$PATH:/usr/local/nginx/sbin
注意:仅修改PATH的值只会对当前shell有效,但是子进程无法使用
2、让当前shell以及子进程都看能使用,使用export
export PATH=$PATH:/usr/local/nginx/sbin 将环境变量导出,使得当前shell以及子进程都生效
但!!!无论是直接使用PATH还是使用export PATH,都仅仅是对当前shell会话有效;
如果我们退出当前终端或者重新开一个终端,nginx这个路径依旧还是用不了
所以这部分只会对当前是shell进程有效
6、仅对某一个用户生效
在每一个用户的家目录中,都有4个隐藏文件
以root家目录为例,ls -a /root/
可以看到有下面4个文件:
.bash_history 记录该用户的命令历史
.bash_logout 在用户退出shell会话的时候执行什么命令,比如说某些重要的用户在操作完服务器之后,我们想要把刚刚操作的命令给删掉,那么就可以在这个文件下输入history -c来自动清除
.bash_profile 配置加载该用户环境变量,一般是用户当前这个用户,而对于其他用户而言是没办法用的,属于一次性初始化设置
.bashrc 用户配置当前用户下设置的命令别名,提示符(这里的提示符指的是终端的样式,比如普通用户的符号是$,我们可以改成喜欢的格式,比如可以显示时间,或者显示前面的路径,等等)
所以,我们可以编辑对应用户家目录下的.bash_profile文件
在该文件你认为比较合适的地方将PATH添加进去即可,再添加的时候我们建议使用export让当前用户的shell以及子进程都能够使用到该环境变量,因此添加如下命令即可
export PATH=$PATH:/usr/local/nginx/sbin
添加完成后可以立即刷新生效
source ~.bash_profile
也可以退出当前终端重新进入即可
7、对所有用户都生效
/etc/profile是系统范围的配置文件;
所有用户在登陆操作系统的时候都会读取它
因此,在这个文件下配置环境变量适用于所有用户;
因此,我们可以把一些常用的命令放到该配置文件中来全局使用
/etc/profile.d/目录的作用是方便管理员细分配置;
并且通过不同的文件名来单独管理环境变量;
这样做方便后期维护
比如在该目录下创建一个nginx.sh里面只写nginx的环境变量
比如在创建一个mysql.sh,里面只写mysql的执行文件路径
这样做的目的是简化和方便管理,一个文件管理一个,所以当用户登录到系统的时候
/etc/profile不但会加载自己文件中的环境变量
还会把/etc/profile.d目录下的shell脚本也一并加载