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. 解决Eclipse中启动Tomcat报unable to start within 45 seconds问题

    启动项目的时候报Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the server ...

  2. KRPano多屏互动原理

    KRPano可以实现多个屏幕之间的同步显示,主要应用到Websocket技术进行通信. 在控制端,我们需要发送当前KRPano场景的实时的视角和场景信息,可以使用如下的代码: embedpano({ ...

  3. 自定义注解实现数据序列化时进行数据脱敏(基于springboot默认jackjson)、消息转换器HttpMessageConverter

    消息转换器 HttpMessageConverter 消息转化器的作用 将请求报文转化为Java对象 将Java对象转化为响应报文 消息转换器接口 public interface HttpMessa ...

  4. 《HelloGitHub》第 90 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  5. 5.go语言函数提纲

    1 本篇前瞻 前端时间的繁忙,未曾更新go语言系列.由于函数非常重要,为此将本篇往前提一提,另外补充一些有关go新版本前面遗漏的部分. 需要恭喜你的事情是本篇学完,go语言中基础部分已经学完一半,这意 ...

  6. jenkins 原理篇——pipeline流水线 声明式语法详解

    大家好,我是蓝胖子,相信大家平时项目中或多或少都有用到jenkins,它的piepeline模式能够对项目的发布流程进行编排,优化部署效率,减少错误的发生,如何去写一个pipeline脚本呢,今天我们 ...

  7. P9073 [WC/CTS2023] 楼梯 题解

    题目链接 简要题意 有一块楼梯,这里指的楼梯是倒着的,正过来看上一层宽度一定小于等于这一层宽度,并且由格子组成,你需要对其进行增删和恢复某一历史版本的操作,并回答这块楼梯是否有固定格数的子楼梯. 题目 ...

  8. python环境配置常用命令

    #安装前请更新 sudo apt-get update python -m pip install --upgrade pip #升级PIP版本 sudo apt-get install python ...

  9. Isito 入门(八):金丝雀发布

    本教程已加入 Istio 系列:https://istio.whuanle.cn 目录 6,金丝雀发布 金丝雀发布 按照流量比例划分 按照 Header 划分 6,金丝雀发布 项目总是处于不断变化之中 ...

  10. Kubernetes:kube-apiserver 之准入

    kubernetes:kube-apiserver 系列文章: Kubernetes:kube-apiserver 之 scheme(一) Kubernetes:kube-apiserver 之 sc ...