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

Linux命令运行原理shell和bash

目录

  • 前言
  • 什么是shell,什么是bash?
  • ls -l 执行过程

前言

学习操作系统的过程中我们经常在自己的shell中执行一些Linux命令,那么当我们输入一个类似于 ls -a 这样的命令式,发生了什么?

换句话说,从我们在shell中输入ls -a 按下回车之后,这条命令在linux底层是怎么被执行的?下面我们详细分析!


什么是shell,什么是bash?

这里写图片描述

shell是一种处于用户态运行的解释器(也是进程),相当于操作系统的"使用界面",是用户和内核通信的中间桥梁, 好比内核的外壳, 我们用户通过对shell的交互,来实现对系统的操作;

bash(/bin/bash)就是linux中默认的shell。他是随着用户连接OS后,启动的不断运行的一个进程;


ls -l 执行过程

回答前言中提出的问题,shell命令框中输入一个ls -l 然后会发生什么?

如下图:
在这里插入图片描述

当某个用户连接系统的时候,会随之创建一个属于他的shell(bash)进程,形成终端界面,等待使用者输入命令进行操作;

当我们按下ls -l后:

  1. shell的main(argc,argv)函数会以命令行传参的形式读取字符串 ls 和 -l,内部解析出命令名称 ls 和参数 l ;
  2. 检查输入的命令是完整命令还是别名,并将其替换成原始的命令名称;

(比如 alias rm=‘rm -i’; 给rm -i命令起别名rm,删除东西时提醒输入Y/N 防止用户误删!这些机制与上面命令处理流程不冲突!)

  1. 进一步检查原始的命令是内部命令(程序)还是外部命令(程序);

(type+命令 可以查看是外部还是内部命令)

  1. 找到这个命令(程序)的位置,并结合对应的选项以某种方式运行这个命令(程序),返回结果;


其实各种命令,本质上也是一个个独立的程序:

内部命令(程序),随着shell进程的初始创建一同存入了内存中,相当于shell进程中的一些函数,直接运行,不需要文件系统IO进内存,也不受环境变量影响,因此执行效率比较高!

ls cd等都是内部命令; vim cat等都是外部命令

外部命令(程序),存在某些PATH环境变量路径中,需要shell去一个路径一个路径的找这个程序,并通过文件系统inode节点等IO进内存,通过shell fork出子进程进行exec程序替换运行,之后shell还要回收,因此执行效率慢;

(创建子进程,进行exec进程替换的原因是为了shell的安全性,万一非法的第三方外部命令是黑客设计的,不能让他影响到shell解释器)

如果键入的命令既不是内部命令,外部的PATH路径也没有,就显示一条command not found的提示信息;;


http://www.kler.cn/a/2816.html

相关文章:

  • 红日靶机(七)笔记
  • 常用中间件介绍
  • 【Xrdp联机Ubuntu20.04实用知识点补充】
  • 网络安全技术在能源领域的应用
  • vscode Markdown
  • 域名服务系统DNS (Domain Name System)
  • 二、Trino406系列 之 集群部署
  • AJAX,Axios,JSON简单了解
  • 看齐iOS砍掉祖传功能,Android 16G内存也危险了
  • HFish蜜罐的介绍和简单测试(一)
  • shell简单使用介绍
  • KafKa知识汇总
  • 大模型未来趋势
  • 【C++进阶】十一、哈希的应用---布隆过滤器(二)
  • Element table组件内容\n换行解决办法
  • 【C++】STL容器、算法的简单认识
  • 【CodeForces】Codeforces Round 859 (Div. 4) D
  • 看完这篇 教你玩转渗透测试靶机vulnhub——My File Server: 1
  • Android11以上版本使用高德定位,定位成功,卫星数一直为0
  • 【TypeScript 入门】14.泛型
  • 微软Bing GPT支持AI绘画了,输入文字就能出图
  • 值得记忆的STL常用算法,分分钟摆脱容器调用的困境,以vector为例,其余容器写法类似
  • Kotlin~Singleton单例模式
  • 文心一言 vs GPT-4 —— 全面横向比较
  • Halcon转OpenCV实例--纺织物折痕检测(附源码)
  • 防火墙和IDS