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

bash shell笔记整理——外部命令和内部命令区别的更多相关文章

  1. Linux命令的内部命令执行

    一个命令可能既是内部命令也是外部命令 因为内部命令优先级高,先执行内部命令 [04:21:44 root@C8[ ~]#type -a echo echo is a shell builtin ech ...

  2. Bash shell 笔记总结(一) 转自http://www.bubuko.com/infodetail-509992.html,谢谢原作者

    本文是上课笔记总结,涉及细节知识点会在以后文章说明! bash脚本编程: 脚本程序:解释器解释执行: shell: 交互式接口:编程环境: shell: 能够提供一些内部命令,并且能通过PATH环境变 ...

  3. linux bash Shell脚本经典 Fork炸弹演示及命令详解

    Jaromil 在 2002 年设计了最为精简的一个Linux Fork炸弹,整个代码只有13个字符,在 shell 中运行后几秒后系统就会宕机: :(){:|:&};: 这样看起来不是很好理 ...

  4. shell笔记整理1---vim编译器基础应用(参考鸟哥)

    1.linux中的配置文件都已是以ASCII的纯文本的形式存在 2.vim文本编译器. 一般模式:用vi打开的一个文件直接进入的就是一般模式,这个模式可以移动光标和删除字符,复制粘贴等,但是不能比那几 ...

  5. docker外部执行容器内部命令

    docker exec jenkins 'cat /var/jenkins_home/secrets/initialAdminPassword'

  6. Bash 中同名的内部命令和外部命令

    昨天有个人在 bug-bash 上问:为什么 [ --help 没有输出帮助信息.有人回答他了,原因是 coreutils 提供的 [ 命令才接受 --help 选项,Bash 自己的 [ 命令不接受 ...

  7. 4.Shell内部命令

    4.Shell内部命令内部命令是由shell自身提供的.如果某个内部命令的名称是一个简单命令的第一个单词,shell会直接执行这个命令,而不会启动其它程序.对于一些不可能或者不方便通过外部程序实现的功 ...

  8. bash shell学习-shell基础 (笔记)

    When you hoist the sails to cross the sea, you willride the wind and cleave the waves. "长风破浪会有时 ...

  9. bash shell笔记1 脚本基础知识

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/505644 * ...

  10. Linux的内部命令和外部命令

    为了提高系统运行效率,将经常使用的轻量的命令在系统启动时一并加载这些命令到内存中供shell随时调用,这部分命令即为内部命令.反之,只有当被调用时才会被硬盘加载的这部分命令即为外部命令. 内部命令实际 ...

随机推荐

  1. ORM分组查询复杂查询

    记录一下自己在工作中遇到的一个问题,就是根据一个字段分类,然后还要统计这个字段不同状态的数量,这里我举个例子 假如有好多学生,这些学生来自不同的班级,现在我们要统计每一个班级中男生和女生的数量 def ...

  2. ssm框架的事物控制

    事物控制统一在逻辑层的实现类中以注解的形式添加,例如:对UserServiceImpl中的addUser方法需要进行事物控制,操作如下: 1.此方法必须为public2.在方法名上边加入@Transa ...

  3. Windows上Dart安装

    过程 *1 去github上下载一个release包或者直接将flutter通过git clone下来 *2 将下载下来的flutter/bin添加到path中 *3 此时运行flutter或者flu ...

  4. 加密 K8s Secrets 的几种方案

    前言 你可能已经听过很多遍这个不算秘密的秘密了--Kubernetes Secrets 不是加密的!Secret 的值是存储在 etcd 中的 base64 encoded(编码) 字符串.这意味着, ...

  5. python url中文转码_python实现转换url编码的方法

    python url中文转码_python实现转换url编码的方法 urllib.parse命令:url编码转换 >>> import urllib.parse >>&g ...

  6. 手动添加winform的combobox和listbox名称和值

    先定义一个ListItem类,工程内其他窗体都可以用的.  public class ListItem : Object     {         public string Text { get; ...

  7. RLChina2022公开课-博弈论

    纯博弈: 单纯的动机组合,离散的集合 混合博弈: 加入了概率论,以百分比的概率执行不同的的动机.,概率分布 零和博弈.合作博弈.协同博弈 扩展博弈和非完美信息 扩展博弈.贝叶斯博弈 纳什均衡 任何一位 ...

  8. 2022/7/26 暑期集训 pj组第6次%你赛

    个人第3次 又是下午打,旁边那帮 不知好歹的 入门组小孩们又在吵吵... T1 老师是不是放反了? T1 是蓝题诶 理所应当地 跳过 然后就忘了写了,连样例也没打...样例可是有7分诶! 到现在也没写 ...

  9. QT(2)-QRegExp

    QT(2)-QRegExp 1 正则表达式 正则表达式--详情版+常用表达式 Qt中正则表达式(常用) Qt 正则表达式介绍 QRegExp的使用 2 QRegExp 2.1 indexIn int ...

  10. spring---面向切面(AOP @Pointcut 表达式篇)

    AOP(面向切面编程),可以说是OOP(面向对象编程)的补充和完善.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合. 当我们需要为分散的对象引入公共行为的时候,O ...