1. 内部命令与外部命令
内部命令:由shell自带的,而且通过某命令形式提供
内部命令在系统启动时就调入内存,是常驻内存的,所以执行效率高。
外部命令:在文件系统路径下有对应的可执行程序文件
外部命令是系统的软件功能,用户需要时才从硬盘中读入内存。
2. 命令类型
(1)判断命令类型
使用type可以判断一个命令是内部命令还是外部命令
如图,cd为内部命令,ifconfig为外部命令。
(2)enable 显示所有启用的内部命令
enable -a显示所有内部命令
(3)enable |wc -l 统计启用的内部命令数量(l是字母不是数字1)
统计出共61条
(4)enable -n COMMAND禁用命令
例如,输入enable –n bg,就可以禁用bg。
输入enable |wc –l 查询发现只有60个
再用enable查询,发现果然没有bg了,即被禁用了。
输入enable –n可以查询所有被禁用的命令
同样,可以使用enable
-n |wc -l 统计被禁用的内部命令数量,可以使用enable
-a |wc -l 统计所有的内部命令数量
(5)enable COMMAND启动命令
使用enable可以使被禁用的命令重新启动
将那三条命令重新启动,查询被禁用里面为空,且启动命令数又恢复到61个了。
(6)关于禁用
禁用内部命令并不是说不能使用,而是需要从硬盘当中去其路径中寻找所对应的外部命令。
3. hash
(1)缓存路径
系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后会将这条命令的路径记录到hash表中,当再次使用该命令时,shell解释器首先会查看hash表,存在将执行之,如果不存在,将会去变量PATH路径下寻找。
使用 echo 查看PATH的路径:
以冒号为间隔符,从左到右依次寻找。
利用hash缓存表可大大提高命令的调用速率。
如图,fdisk是一个外部命令,当运行过后,这个命令就多了一个hash,即将路径缓存了下来。
缓存过后就不用去PATH路径依次去找了。
※这里举一个例子。分别运行pwd和ifconfig,使其缓存到hash里,可以看到ifconfig的路径在pwd之前。然后我们使用cp命令,将ifconfig复制到pwd之前的路径并且也命名为pwd。从理论上来说,应该通过路径按照顺序从左到右去寻找,会先找到/usr/local/sbin/pwd,内容应该为ifconfig的内容,但是我们执行pwd之后发现仍然是pwd的结果,并且查询pwd的路径仍然为/bin/pwd。
这就说明,在之前运行的时候就已经将pwd的路径缓存到/bin/pwd中了,所以再次运行时不需要在PATH路径中依次寻找,而是调用hash缓存中的路径。
(2)hash 显示当前被hash的所有外部命令
hash -l 显示当前被hash的外部命令,包含别名
(3)hash -d name删除hash
现在我们将hash中的缓存的pwd删除,删除时需要输入的name就是用hash –l查到的别名。
可以看出列表中没有了pwd。
然后我们查看一下pwd的类型,发现地址变成之前复制过去的地址了,因为缓存被删除了。
所以此时执行pwd,应该是ifconfig的内容了。
PS:也可以使用hash -r 清空所有的hash。
hash -p /…/…. name 可以手动增加一个hash缓存。
总结:当执行一个命令时,它的优先级为:
内部命令> hash
> PATH
原创文章,作者:T_endless,如若转载,请注明出处:http://www.178linux.com/80244