bash shell笔记整理——外部命令和内部命令区别

linux命令的类别:

  1. 外部命令
  2. 内部命令

什么是内部命令

bash shell程序内部自带的命令。

什么是外部命令

不是bash shell内建命令,bash会根据用户给定的命令从PATH环境变量中搜寻,找到后会使用hash(一个命令、一个程序)进行缓存以提高下次的调用外部命令的速度。

如何区分是外部还是内部命令

方法一:使用type命令可以根据输出结果进行判断

type命令用法:

type [-afptP] 命令 [NAME...]

选项:(这些选项几乎很少用到,有需要可以自行使用“help type”进行查看)
NAME:命令

示例1:

[root@nginx-proxy1 ~]# type cp
cp 是 `cp -i' 的别名

[root@nginx-proxy1 ~]# type date
date 是 /usr/bin/date

# 查看alias是属于哪种类型的命令,结果显示为内部命令
[root@nginx-proxy1 ~]# type alias
alias 是 shell 内嵌

# 同时查看多个命令
[root@nginx-proxy1 ~]# type cp mv
cp 是 `cp -i' 的别名
mv 是 `mv -i' 的别名

方法二:使用help命令区分

一般情况下,help 命令如果有输出帮助文档,那么这类命令大多都是内建命令,而外部命令基本上都是使用man来查看帮助文档,但不是绝对。(实际上我们并不需要过多去关注是外部还是内部命令)

从上面的示例1,我们知道,alias是内建命令,而date是外部命令,此时我们使用help来查看这两个命令。

# 从返回输出中我们可以看到help无法找到cp命令的帮助主题。
[root@nginx-proxy1 ~]# help cp
bash: help: 没有与 `cp' 匹配的帮助主题。尝试 `help help' 或者 `man -k cp' 或者 `info cp'。

# 而alias别名则可以找到
[root@nginx-proxy1 ~]# help alias
alias: alias [-p] [名称[=值] ... ]
    定义或显示别名。
    
    不带参数时, `alias' 以可重用的格式
    `alias 名称=值'在标准输出设备上打印别名列表。
    
    否则,对于每个给定值的名称定义一个别名。
    值末尾的空格会使下一个词被检测
    作为别名替换展开。
    
    选项:
      -p	以可重用的格式打印所有的已定义的别名
    
    退出状态:
    除非一个没有定义的名字被作为参数提供,否则 alias 
    返回值为真。

关于外部命令通过hash缓存提速下次使用

​ 上面我们讲到外部命令被使用后,为了提高下一次查找速度,bash会对其进行hash映射成一个表(通过使用hash命令),用于记录命令对应的所在的具体路径。

首先我们来看看hash 命令到底属于哪种类型的命令

# 从结果后我们可以清晰得看到hash是bash shell的内建命令
[root@nginx-proxy1 ~]# type hash
hash 是 shell 内嵌

接下来我们来运行下hash命令

[root@nginx-proxy1 ~]# hash
命中	命令
   1	/usr/bin/grep
   1	/usr/bin/whereis
   6	/usr/bin/man

# 这类的命中指的是用户使用改命令时是否命中了hash之前所缓存下来的映射表,每当你运行同一个命令就会累加一次。
# 这里我特意再运行一次whereis命令
[root@nginx-proxy1 ~]# whereis hash
hash: /usr/share/man/man1/hash.1.gz /usr/share/man/man1p/hash.1p.gz

# 再次运行hash命令,可以看到whereis命令的命中次数变成了2.
[root@nginx-proxy1 ~]# hash
命中	命令
   1	/usr/bin/grep
   2	/usr/bin/whereis
   6	/usr/bin/man

hash命令的一些选项用法:

选项 作用
-d 删除指定命令再hash表中的缓存
-r 删除所有被hash缓存的命令

示例:

[root@nginx-proxy1 ~]# hash
命中	命令
   1	/usr/bin/grep
   2	/usr/bin/whereis
   6	/usr/bin/man
   
# 将whereis从hash缓存表中删除
[root@nginx-proxy1 ~]# hash -d whereis

# 再次查看已经被删除了
[root@nginx-proxy1 ~]# hash
命中	命令
   1	/usr/bin/grep
   6	/usr/bin/man

posted @ 2021-01-31 20:07  蕝戀  阅读(326)  评论(0编辑  收藏  举报