当前位置: 首页 > news >正文

Linux shell 内建命令

文章目录

  • 前言
  • 一、shell简介
  • 二、外部命令
  • 三、内建命令
  • 总结

前言

一、shell简介

shell 是Linux系统中一个提供命名行的交互式工具,本质是一个c语言可执行程序,为用户提供了启动程序,管理文件系统中的文件以及运行在Linux系统上的进程的途径。命令行提示符是shell负责交互的部分,允许用户输入文本命令,然后解释命令,并在内核中执行。

Linux系统上有多种shell可用,Linux发行版默认的shell都是bash shell,接下来主要介绍bash shell。

系统中启动哪种类型的shell,取决用个人用户ID配置,在/etc/passwd文件中可见。只要用户登录到某个虚拟控制终端或是在GUI中启动终端仿真器,默认的shell程序就会开始运行。

我在我的Ubuntu20.04上打开终端,这时候默认的shell程序就开始运行了,同时第一次登录是父shell,提供CLI提示符,等待命令输入。
在这里插入图片描述
用户 yl 用 bash shell作为自己的默认程序,bash shell位于/bin目录下,/bin/bash是一个可执行的二进制程序,
在这里插入图片描述

x代表可执行,ls 加-F选项,会在可执行文件中的后面加一个 * 号,以便用户找出系统上可执行的文件。
-F选项也可以区分文件夹和文件。
在这里插入图片描述

二、外部命令

外部命令也被称为文件系统命令,是存在与 bash shell之外的程序,之前说过bash shell本质是也是一个二进制可执行程序。通常位于 /bin、/usr/bin、/sbin或/usr/sbin下。
在这里插入图片描述

当执行外部程序时,父进程bash shell会执行 fork() 创建一个子程序,子程序调用exec() 执行当前的外部程序,执行完之后结束自己的生命,等待bash shell 父进程调用 wait() 进行回收子程序的资源。

创建一个进程会有一定的开销,会打开文件,进行磁盘文件IO操作。

外部命令比如,可以使用 type 来确定一个命令是否是外部程序。
在这里插入图片描述
$PATH 变量包含的目录中系统中绝大多数的可执行命令,它们都是外部命令:
在这里插入图片描述

三、内建命令

内建命令并不需要父进程bash shell创建一个子程序,内建命令是bash shell程序的一部分,执行内建命令等于调用bash shell程序的一个程序。可以使用 type 来确定一个命令是否是内建命令。
在这里插入图片描述

内建命令属于shell执行的一部分,因此执行内建命令不需要创建子进程,也不需要打开程序文件,这样不用操作文件IO,执行效率高,运行快。

还有一些命令即属于外部命令也属于内建命令,用 type -a 进行查看,比如:
在这里插入图片描述
其中which命令只显示出外部命令文件。

对于即属于外部命令也属于内建命令的,要想执行外部命令,输入指定文件:
在这里插入图片描述

总结

内建命令比外部命令,效率更高,执行更快,执行内建命令相当于调用当前 Shell 进程的一个函数。比如cd、exit 这些是内部命令,本质是函数调用,可以直接使用,内建命令并不是某个外部程序,而是bash shell该程序的组成部分,只要在 bash shell 中就可以运行这个命令。

内建命令不会受到系统环境变化的影响。

执行外部命令时,会打开文件,不但会产生磁盘 I/O,还需要调用 fork 创建一个进程来执行,执行完成后再退出。

相关文章:

  • 计算机网络 --- TCP与UDP协议
  • Redis缓存的连环炮面试题
  • 9月17日 杭州站 | Serverless Developer Meetup 开启报名
  • django+django-haystack+Whoosh(后期切换引擎为Elasticsearch+ik)+Jieba+mysql
  • 【020】基于Springboot+Vue的学生成绩教务管理系统(含教师、学生、管理员身份)含源码、数据库、运行教程
  • 基于KubeEdge的边缘节点分组管理设计与实现
  • Docker(精简版)
  • 猿创征文|Apache ShenYu网关插件介绍
  • 全志V853开发板开发进阶——GPADC
  • 表单(非常非常重要)
  • 【JavaScript】一文了解JS的闭包
  • 2022前端vue面试题
  • docker相关试题
  • python 之名称空间与作用域
  • python之面向过程编程思想与匿名函数及其应用
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Angular数据绑定机制
  • hadoop集群管理系统搭建规划说明
  • input实现文字超出省略号功能
  • javascript 哈希表
  • JWT究竟是什么呢?
  • Leetcode 27 Remove Element
  • nfs客户端进程变D,延伸linux的lock
  • Objective-C 中关联引用的概念
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 记一次删除Git记录中的大文件的过程
  • 码农张的Bug人生 - 初来乍到
  • 容器服务kubernetes弹性伸缩高级用法
  • 入手阿里云新服务器的部署NODE
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 微信开源mars源码分析1—上层samples分析
  • 小程序 setData 学问多
  • 一个完整Java Web项目背后的密码
  • Nginx实现动静分离
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​Spring Boot 分片上传文件
  • (27)4.8 习题课
  • (SpringBoot)第七章:SpringBoot日志文件
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)shell调试方法
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Core 成都线下面基会拉开序幕
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net Stream篇(六)
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .stream().map与.stream().flatMap的使用
  • [1525]字符统计2 (哈希)SDUT
  • [20170728]oracle保留字.txt
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [Angular 基础] - 表单:响应式表单
  • [BUG]vscode插件live server无法自动打开浏览器