Linux命令运行原理shell和bash

浅浅的花香味﹌ 2024-03-26 20:44 165阅读 0赞

目录

  • 前言
  • 什么是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的提示信息;;

发表评论

表情:
评论列表 (有 0 条评论,165人围观)

还没有评论,来说两句吧...

相关阅读

    相关 linux bash shell

    特殊变量:$?上一个命令执行状态的返回值。   程序执行可能有两种返回值:   1. 程序执行结果   2. 程序状态返回吗(0-255)     0 则为执行正

    相关 Bash百宝箱】shell命令

    1、简单命令 简单命令即命令本身,只有一个命令,有些命令有一个或多个参数,它们以空格分隔。 2、多个命令 执行多个命令最简单的方法是使用分号“;”把它们分隔开来,

    相关 Bash shell之管道命令

    就如同前面所说的, bash 命令执行的时候有输出的数据会出现! 那么如果这群数据必需要经过几道手续之后才能得到我们所想要的格式,应该如何来设定? 这就牵涉到管线命令的问题了