linux 内部命令和外部命令
2019-10-17 本文已影响0人
黑曼巴yk
前言
Linux中的命令大致分为两类:内部命令和外部命令
内部命令也称shell内嵌命令,外部命令存放在一个文件中,需要时候在文件中查找,这些文件定义在$PATH
中
首先linux所有的都是文件,我们在操作系统加载的时候会加载shell表现为/bin/bash
文件
[root@iZbp1ge7stkcnj5044oa81Z ~]# ll /bin/bash
-rwxr-xr-x. 1 root root 964608 Oct 31 2018 /bin/bash
内部命令
- 内部命令可以通过
enable
命令来查看。
enable .
enable :
enable [
enable alias
enable bg
enable bind
enable break
enable builtin
enable caller
enable cd
// ...
-
为什么需要内部命令
shell本身开机就会运行,因此内部命令执行速度非常快。不需要临时去磁盘加载命令。 -
判断内部命令
// 内部命令
[root@iZbp1ge7stkcnj5044oa81Z ~]# type type
type is a shell builtin
// 外部命令
[root@iZbp1ge7stkcnj5044oa81Z ~]# type who
who is /usr/bin/who
外部命令
外部命令表现为一个磁盘文件
- 查看外部命令的磁盘路径
- 使用which命令查看
[root@iZbp1ge7stkcnj5044oa81Z ~]# which pwd
/usr/bin/pwd
- 使用whereis命令查看
whereis 不仅能查看文件路径,还能查看帮助文档的路径等
[root@iZbp1ge7stkcnj5044oa81Z ~]# whereis pwd
pwd: /usr/bin/pwd /usr/include/pwd.h /usr/share/man/man1/pwd.1.gz
命令执行过程
首先判断是否是内部命令 type pwd
。如果是外部命令则通过$PATH
来查找。我们看先$PATH 里面的值是多少?
[root@iZbp1ge7stkcnj5044oa81Z ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
我们只要执行过的命令都通过hash存在内存中。
[root@iZbp1ge7stkcnj5044oa81Z ~]# whereis pwd
pwd: /usr/bin/pwd /usr/include/pwd.h /usr/share/man/man1/pwd.1.gz
[root@iZbp1ge7stkcnj5044oa81Z ~]# type whereis
whereis is hashed (/usr/bin/whereis)
这里我们执行过whereis
命令。下次执行时候显示whereis is hashed
,说明是从内存中直接读取。我们通过hash
命令可以查看缓存的路径
[root@iZbp1ge7stkcnj5044oa81Z ~]# hash
hash: hash table empty
[root@iZbp1ge7stkcnj5044oa81Z ~]# whereis pwd
pwd: /usr/bin/pwd /usr/include/pwd.h /usr/share/man/man1/pwd.1.gz
[root@iZbp1ge7stkcnj5044oa81Z ~]# hash
hits command
1 /usr/bin/whereis