bash shell笔记整理——外部命令和内部命令区别
linux命令的类别:
- 外部命令
- 内部命令
什么是内部命令
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
本文来自博客园,作者:蕝戀,转载请注明原文链接:https://www.cnblogs.com/juelian/p/14353767.html