Linux命令有内部命令(内建命令)和外部命令之分,内部命令和外部命令功能基本相同,但也有些细微差别。
内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留在系统内存中。内部命令是写在bashy源码里面的,其执行速度比外部命令快,因为解析内部命令shell不需要创建子进程。比如:exit,history,cd,echo等。
外部命令是linux系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调用内存。通常外部命令的实体并不包含在shell中,但是其命令执行过程是由shell程序控制的。shell程序管理外部命令执行的路径查找、加载存放,并控制命令的执行。外部命令是在bash之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin......等等。可通过“echo
$PATH”命令查看外部命令的存储路径,比如:ls、vi等。
用type命令可以分辨内部命令与外部命令
[root@localhost account]# type cd
cd is a shell builtin
pwd命令用于显示当前工作目录,是Linux系统下最常用的命令之一。在不太能确定当前位置时,可以使用pwd命令来判断目录在文件系统内的确切位置。而涉及pwd指令,就不得不提及三个环境变量:PATH、OLDPWD、PWD。
PATH:执行文件路径的变量;"echo $PATH"(PATH前面加$表示后面接的是变量)
OLDPWD:表示前一次的工作目录;
PWD:表示当前的工作目录。
问题缘由:当输入“man pwd”时可以查看pwd的帮助文档,而输入“pwd --help”就提示有错误bash: pwd: --: invalid option;若输入“ /bin/pwd --help”就能正常显示pwd的帮助文档。
从网上查找原因并经过整合可知,这主要是由于内部命令和外部命令的区别,pwd是内部命令,而/bin/pwd就是外部命令。在显示当前目录时,/bin/pwd能显示当前工作目录的完整文件路径,能更准确些。在多人共享同一台Linux机器时,经常会发现当前目录被别人删除后,pwd命令仍然会显示那个目录。
后续试验:切换至root权限下,将/bin目录下的执行文件ls移动到非正规目录中去,mv /bin/ls /root(#mv为移动,可将文件在不同的目录间进行移动操作),然后不管在哪个目录底下输入任何与ls相关的指令,都不能顺利执行ls了(因为/root这个目录并不在PATH指定的目录中,外部命令ls是没法通过PATH路径找到执行文件ls),除非用/root/ls
才行。
如果想要让root在任何目录下均可执行/root底下的ls,那么可以将/root加入到PATH当中,该命令PATH="$PATH":/root即可。若有两个ls指令在不同的目录中,例如/usr/local/bin/ls
和/bin/ls ,那么当我下达 ls命令时,是根据PATH里面哪个目录先被查询到,则那个目录下的指令就先被执行。
而即使采用相同的方法移动/bin目录下的执行文件pwd,仍可以输入pwd命令执行,因为这时仍是调用内部命令pwd指令。
故shell命令解释器在执行命令时,是应先执行内部指令,若要执行的指令不是内部指令,则应是调用的外部指令。