Linux可执行文件安装路径
Linux的文件路径管理比windows整齐的多,可执行文件都会放在对应的bin目录下。但是Linux的可执行文件的路径非常多,通常有如下几个:
/bin /sbin /usr/bin /usr/sbin /usr/lcoal/bin /usr/local/sbin /usr/home/user_name/bin
这些都是可执行文件的路径,到底有什么区别呢?
首先,由于Linux的任意目录都可以挂在在一个分区上,/bin和/sbin目录下就是系统启动、挂载/usr目录前的必要内核文件;/bin多用于用户命令比如ls,mv,cp,mount等;而/sbin中的s就是system的意思,多为非普通用户执行的命令,比如iptable,clock,fdisk等;
其次,Linux发行版都存在源管理软件,通过源管理软件可以快速简便的安装软件,ubuntu下为apt-get,centos则为yum,虽然名字不同,但是用法基本相同;源管理软件安装的软件都在/usr/bin和/usr/sbin目录下;sbin和bin的区别同上;
由于上面两条的存在,也就很好解释/usr/local/bin和/usr/local/sbin了,那就是用户通过make install安装的软件的路径;sbin和bin的区别同上;
在user_name路径下的bin则就是该用户自己的程序,并不是给所有用户用的。
环境变量
而我们一般输入程序的名字就可以执行,一般是由于bin目录加入了环境变量,在命令行输入echo $PATH就可以看到环境变量的目录,例如:
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/user_name/bin
这里的路径顺序是有优先级的,当在前面的目录找到了就不会再去找后面的目录。可以看到/usr/local/bin的优先级大于/usr/bin,这也就以为了你通过make install安装的程序的优先级大于使用源管理器安装的程序。这在当需要某程序的新版本,而源管理器中只存在旧版本的情况非常有帮助。比如:centos6.x中集成的python版本为2.6,而目前 2.6已经停止维护,问的的python版本为2.7,但是绝大多数源既然没有针对centos6.x的python2.7,所以要升级python版本,可以通过wget源码然后make install之后的python安装在目录/usr/local/bin目录下,一般可执行文件名字为python2.7。不用考虑删除/usr/bin目录中的python2.6,因为/usr/bin目录下的程序是源管理器管理的,手动删除会破坏其完整性。但是为什么当我输入python -v查看版本的时候还是2.6不是2.7呢?因为你用的是python命令而不是python2.7,如果想让python命令也执行2.7版本,有人建议创建一个alias,当执行python的之后其实执行的是/usr/local/bin/python2.7,也有人建议ln -sf /usr/local/bin/python2.7 /usr/bin/python,其实这都不是好版本,其实只要在/usr/local/bin/目录下创建名为python的链接即可,即:
cd /usr/local/bin ln -s python2.7 python
这时,只要保证环境变量中/usr/local/bin的优先级在/usr/bin的前面即可。
sudo的环境变量
但是当使用sudo命令的时候,发现/usr/local/bin的环境变量失效了。这是因为sudo默认使用了安全的环境变量,可以打开/etc/sudoers文件,修改其中的
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
为
Defaults env_keep += "HOME"
这样就解决了使用sudo时环境变量不一致的问题。