内部命令与外部命令——Linux基本命令(3)

1.     内部命令与外部命令

内部命令:由shell自带的,而且通过某命令形式提供

内部命令在系统启动时就调入内存,是常驻内存的,所以执行效率高。

外部命令:在文件系统路径下有对应的可执行程序文件

外部命令是系统的软件功能,用户需要时才从硬盘中读入内存。


2.     命令类型

1)判断命令类型

使用type可以判断一个命令是内部命令还是外部命令

内部命令与外部命令——Linux基本命令(3)

如图,cd为内部命令,ifconfig为外部命令。

 

2enable 显示所有启用的内部命令

 内部命令与外部命令——Linux基本命令(3)

enable -a显示所有内部

3enable |wc -l 统计启用的内部命令数量(l是字母不是数字1

内部命令与外部命令——Linux基本命令(3)

统计出共61

 

4enable -n COMMAND禁用命令

例如,输入enable –n bg,就可以禁用bg

输入enable |wc –l 查询发现只有60

再用enable查询,发现果然没有bg了,即被禁用了。

内部命令与外部命令——Linux基本命令(3)

输入enable –n可以查询所有被禁用的命令

内部命令与外部命令——Linux基本命令(3)

同样,可以使用enable
-n |wc -l
统计被禁用的内部命令数量,可以使用enable
-a |wc -l
统计所有的内部命令数量

 

5enable COMMAND启动命令

使用enable可以使被禁用的命令重新启动

内部命令与外部命令——Linux基本命令(3)

将那三条命令重新启动,查询被禁用里面为空,且启动命令数又恢复到61个了。

 

6)关于禁用

禁用内部命令并不是说不能使用,而是需要从硬盘当中去其路径中寻找所对应的外部命令。

内部命令与外部命令——Linux基本命令(3)

 

3.     hash

1)缓存路径

系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后会将这条命令的路径记录到hash表中,当再次使用该命令时,shell解释器首先会查看hash表,存在将执行之,如果不存在,将会去变量PATH路径下寻找。

使用 echo 查看PATH的路径:

内部命令与外部命令——Linux基本命令(3)

以冒号为间隔符,从左到右依次寻找。

利用hash缓存表可大大提高命令的调用速率。

如图,fdisk是一个外部命令,当运行过后,这个命令就多了一个hash,即将路径缓存了下来。

内部命令与外部命令——Linux基本命令(3)

缓存过后就不用去PATH路径依次去找了。

 

这里举一个例子。分别运行pwdifconfig,使其缓存到hash里,可以看到ifconfig的路径在pwd之前。然后我们使用cp命令,将ifconfig复制到pwd之前的路径并且也命名为pwd。从理论上来说,应该通过路径按照顺序从左到右去寻找,会先找到/usr/local/sbin/pwd,内容应该为ifconfig的内容,但是我们执行pwd之后发现仍然是pwd的结果,并且查询pwd的路径仍然为/bin/pwd

这就说明,在之前运行的时候就已经将pwd的路径缓存到/bin/pwd中了,所以再次运行时不需要在PATH路径中依次寻找,而是调用hash缓存中的路径。

内部命令与外部命令——Linux基本命令(3)

 

2hash 显示当前被hash的所有外部命令

内部命令与外部命令——Linux基本命令(3)

 

hash -l 显示当前被hash的外部命令,包含别名

内部命令与外部命令——Linux基本命令(3)

 

3hash -d name删除hash

现在我们将hash中的缓存的pwd删除,删除时需要输入的name就是用hash –l查到的别名。

内部命令与外部命令——Linux基本命令(3)

可以看出列表中没有了pwd

然后我们查看一下pwd的类型,发现地址变成之前复制过去的地址了,因为缓存被删除了。

内部命令与外部命令——Linux基本命令(3)

所以此时执行pwd,应该是ifconfig的内容了。

 内部命令与外部命令——Linux基本命令(3)


PS:也可以使用hash -r 清空所有的hash

hash -p /…/…. name 可以手动增加一个hash缓存。

 

总结:当执行一个命令时,它的优先级为:

         内部命令> hash
> PATH

原创文章,作者:T_endless,如若转载,请注明出处:http://www.178linux.com/80244

(1)
T_endlessT_endless
上一篇 2017-07-13 16:13
下一篇 2017-07-13 17:55

相关推荐

  • Python函数式编程指南(四):生成器

    转自 http://www.cnblogs.com/huxi/archive/2011/07/14/2106863.html 生成器是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以大声地说:生成器提供了非常方便的自定义迭代器的途径。 这是函数式编程指南的最后一篇,似乎拖了一个星期才写好,嗯…… 转载请注明原作者和原文地…

    Linux干货 2015-03-09
  • 马哥教育网络班22期+第三周(8.22-8.28)博客作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。   # who|awk '{print $1}'|sort| uniq 2、取出最后登录到当前系统的用户的相关信息。   # last   # last|gr…

    Linux干货 2016-08-29
  • Shell编程if语句

    Shell编程if语句 条件选择if语句(#if输入keywork) 选择执行: 注意:if语句可嵌套 单分支 if 判断条件(#如果为真执行下一条);then 条件为真的分支代码 fi(结尾) 双分支 if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 fi if 语句 多分支 if 判断条件1; then 条件为真的分支代码 e…

    2018-01-01
  • Linux基础入门命令

    在经过一个星期的入门学习后,对于LINUX的认识也从陌生到了基本了解。总结了一下一周所学习的基本命令。 一、想要查看你当前所在的终端?看下面几条命令: 查看当前登陆的终端名:tty 、whoami ;   查看当前登陆的终端名的详细信息:who am i ; 查看当前所有登陆的终端的详细信息: w ; 二、SHELL 的相关用法 &nbs…

    2017-07-14
  • Awk 高级应用

                              Awk 简介   Awk 是一种变成语言,用于在Linux/UNIX下对文本和数据进行扫描与处理,数据可以来自标准输入,文件 ,管道。Awk分别代表其作者的姓…

    2017-07-17
  • ifconfig命令学习

    ifconfig命令 网络配置 ifconfig命令被用于配置和显示Linux内核中网络接口的网络参数。用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在。要想将上述的配置信息永远的存的电脑里,那就要修改网卡的配置文件了。 语法 ifconfig(参数) 参数 add<地址>:设置网络设备IPv6的ip地址; del&lt…

    Linux干货 2017-07-02