实验环境:
CentOS 6.5
[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32-431.el6.i686 #1 SMP Fri Nov 22 00:26:36 UTC 2013 i686 i686 i386 GNU/Linux
[root@localhost ~]#
首先看下PATH变量在不同用户下的值:
root用户:
[root@localhost ~]# whoami
root
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]#
普通用户:
[test1280@localhost ~]$ whoami
test1280
[test1280@localhost ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/test1280/bin
bin是binary的缩写,二进制。
上述六个目录的含义:
/bin:通常是普通用户和超级用户都会用到的必要的命令,例如ls,pwd等等。
[root@localhost ~]# which ls
alias ls='ls --color=auto'
/bin/ls
[root@localhost ~]# which pwd
/bin/pwd
[root@localhost ~]# su - test1280
[test1280@localhost ~]$ which ls
alias ls='ls --color=auto'
/bin/ls
[test1280@localhost ~]$ which pwd
/bin/pwd
[test1280@localhost ~]$
/sbin:通常是系统管理员使用的必要的来管理系统的命令,例如shutdown,ifconfig等等。
[root@localhost ~]# which shutdown
/sbin/shutdown
[root@localhost ~]# which ifconfig
/sbin/ifconfig
[root@localhost ~]# su - test1280
[test1280@localhost ~]$ which shutdown
/sbin/shutdown
[test1280@localhost ~]$ which ifconfig
/sbin/ifconfig
[test1280@localhost ~]$
注:sbin意义为system binary。
/usr/bin:通常是一些非必要的,但是普通用户和超级用户都可能使用到的命令,例如gcc,ldd等等。
[root@localhost ~]# which gcc
/usr/bin/gcc
[root@localhost ~]# which ldd
/usr/bin/ldd
[root@localhost ~]# su - test1280
[test1280@localhost ~]$ which gcc
/usr/bin/gcc
[test1280@localhost ~]$ which ldd
/usr/bin/ldd
[test1280@localhost ~]$
注:很多时候我们自己安装的软件,可能在此处建立一个软连接(符号链接),指向实际的可执行文件。
/usr/sbin:通常是一些非必要的,由系统管理员来使用的管理系统的命令,例如crond,httpd等等。
[root@localhost ~]# which crond
/usr/sbin/crond
[root@localhost ~]# which httpd
/usr/sbin/httpd
[root@localhost ~]# su - test1280
[test1280@localhost ~]$ which crond
/usr/sbin/crond
[test1280@localhost ~]$ which httpd
/usr/sbin/httpd
[test1280@localhost ~]$
注:这里面有很多类似httpd等这样的后台程序,主要是提供一些服务,有相当一部分是关于网络的(并不全是,例如crond),这个时候这个进程就是作为一个“服务器”,接受外部的请求。
/usr/local/bin:通常是用户后来安装的软件,可能被普通用户或超级用户使用。
/usr/local/sbin:通常是用户后来安装的软件,一般是用来管理系统的,被系统管理员使用。
从用户权限角度来看,*sbin下的命令都是用来管理系统的,所以一般是普通用户无法执行,只有系统管理员可以执行,而*bin下的命令则是所有用户都可以执行的。
注:以上所说的并不是绝对的,例如ifconfig在/sbin下,但是普通用户一般具有可执行权限。
[test1280@localhost ~]$ ll /sbin/ifconfig
-rwxr-xr-x. 1 root root 70024 May 10 2012 /sbin/ifconfig
[test1280@localhost ~]$
从可运行的时间角度看,/bin以及/sbin是和/在同一文件系统,在挂载其他文件系统之前就可以使用/bin以及/sbin下的命令。
/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin可能与根文件系统不在同一文件系统之中,可能是在其他文件系统中后挂载上去的。
使用Tarball(源代码)编译安装的软件通常都是在/usr/local/bin以及/usr/local/sbin中。
十分重要的二进制程序放置在/bin以及/sbin中;
不是十分重要的二进制程序放置在/usr/bin以及/usr/sbin中。
进行这样子的分隔是为了尽可能地缩小根分区。
在最开始不同用户下的PATH示例中我们看到,普通用户与超级用户有基本一样的PATH(包含的搜索目录列表差不多),但是他们在看到一个命令时搜索的路径顺序不相同。
在我实验的环境中,普通用户也是包含了*sbin这样的目录列表。
在有些版本中,普通用户的PATH不包含*sbin目录列表,所以当执行ifconfig时,通常会报command not found这样的错误,原因是ifconfig在/sbin中,但是PATH没有包含/sbin这个目录,导致报错。
这个时候如果我们用绝对路径来执行:
/sbin/ifconfig
如果ifconfig对一般用户具有可执行权限,那么就可以正常执行。
关键点在于,告诉你当前的shell,我去哪里找这个命令(可执行文件)。
当PATH包含的目录下没有时,我可以使用绝对路径来指定。
下面这四句话是引用自别的博客:
如果是用户和管理员必备的二进制文件,就会放在/bin;
如果是系统管理员必备,但是一般用户根本不会用到的二进制文件,就会放在/sbin;
如果不是用户必备的二进制文件,多半会放在/usr/bin;
如果不是系统管理员必备的工具,如网络管理命令,多半会放在/usr/sbin;
参考资料:
1.http://blog.sina.com.cn/s/blog_8184e03301012z2x.html
2.http://blog.csdn.net/kkdelta/article/details/7708250
3.http://blog.csdn.net/xh16319/article/details/12861523