3.1 > Shell

本节概览

在 上一节 中我们了解了 Linux 的桌面环境,包括 GUI 、 TTY 和 VNC 等的介绍和使用。在本节中将介绍 Shell 是个什么东西,我们到底是如何通过 Shell 来操作计算机的,以及一些常见的 Shell 版本有哪些和它们有什么特点。

目录

    • 本节概览
    • Shell 到底是什么
    • Shell 命令的执行流程
    • 常见的 Shell 有哪些
      • sh & bash
      • zsh
      • dash
      • fish

Shell 到底是什么

Shell 是计算机操作系统中的一个命令行解释器,一般由C语言编写,用于用户与操作系统之间的交互。普通意义上的 Shell 就是指可以接受用户输入命令的程序。它之所以被称作 Shell 是因为它隐藏了操作系统低层的细节。同样的 Linux 下的图形用户界面GNOME 和 KDE,也被叫做“虚拟Shell”或“图形Shell”。

Shell 既是用户与内核交互的界面,同时也是一种控制计算机系统的脚本语言,相较于 Windows 下的 PowerShell 基本没多少人使用,Linux 下的系统控制、各种程序的解释等都是 Shell 来完成的。

如下图,当用户在 Shell 上输入命令后,Shell 将负责把命令转换成 kernel 能够理解的语句交给 kernel 来执行。
在这里插入图片描述

Shell 命令的执行流程

计算机系统中,当用户输入一条 Shell 命令时,Shell 会将其解析并通过操作系统执行,从而控制内核来完成相应的任务。以下是 Shell 命令的执行流程:

  • 接受用户或者脚本输入:当用户输入命令或者通过脚本文件输入命令时,shell 将接受输入的字符串。
  • 命令解析:Shell 将用户输入的命令字符串进行解析,识别出命令、参数和选项等部分;然后将解析到的命令按照预定的语法规则来解析,如果是内建命令(如 cd)则直接执行即可,而不调用系统命令解释器。
  • 查找命令:对于非内建命令,Shell 会在环境变量 $PATH 指定的目录中查找相应的可执行文件,如果找到该文件,将首先确认其权限,确保用户有执行权限才能执行命令。
  • 创建子进程:Shell 通过系统调用(如 fork)创建子进程并在其中执行命令。通过子进程执行命令可以确保命令执行不会受到当前父进程运行的影响,同时也方便控制命令的生命周期。
  • 命令执行:子进程使用 exec 等系统调用将自己替换为指定的可执行程序,并加载该程序到内存中执行;同时在命令执行期间,Shell 还要负责处理管道、重定向符号等的运算。
  • 等待命令完成:Shell 进入阻塞态以等待子进程执行完毕。此过程一般通过 wait 系统调用实现;但也可以选择将进程放入后台(使用后台执行关键符号 &),使得 Shell 无需等待该进程完成,直接返回新的输入提示符。
  • 返回结果:当子进程执行完毕后,它会向 Shell 返回一个退出状态码,用以指示该命令的执行结果(如 0 表示成功,非零表示失败)。
  • 销毁子进程:Shell 回收子进程资源,最后再检查是否还有需要处理的任务(如后台任务、信号等),然后返回提示符等待用户输入新的命令。

在这里插入图片描述

Shell 命令执行简易流程

Shell 作为用户和内核之间的中介,将用户输入的文本命令转化为系统可以执行的操作,再借助系统调用控制硬件资源,从而完成用户的需求。

常见的 Shell 有哪些

sh & bash

sh(Bourne Shell) 是 Unix 系统上最早的 Shell,它由 AT&T 贝尔实验室的史蒂夫·伯恩在 1977 年在 Unix 中针对大学与学院发布的。它的二进制程序在大多数的 Unix 系统中位于 /bin/sh 目录下,后来的 Shell 都从它演化而来。它的功能虽然有限,但兼容性高,到现在仍然是许多脚本的标准 Shell。

bash(Bourne-Again SHell)是布莱恩·福克斯在 1987 年由为了 GNU 计划而编写的 Shell。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,由于其开源特性,所以几乎在所有 Linux 发行版中、早期 mac 电脑、现在 Windows wsl 子系统中都默认安装有它。bash 的命令语法是 sh 命令语法的超集。几乎各种 sh 脚本不经修改即可以在 bash 环境中执行,只有那些引用了 sh 特殊变量或内建命令的脚本才需要修改。

bash 官方网站:https://www.gnu.org/software/bash/
bash GitHub 地址:https://github.com/bminor/bash

zsh

zsh(Z Shell)是由保罗·弗斯塔德于 1990 年在普林斯顿大学求学时编写的。zsh 对 sh 做出了大量改进,同时加入了 bash、ksh及 tcsh 等其他各种 shell 的优秀功能。相比于其他的 shell,zsh 因其高度的定制化和强大的插件支持而闻名,截至目前,Oh My Zsh 这个网站提供了超过 300 个插件和 150 个主题,你可以在这个网站上找到你任何想要的插件和主题来 DIY 你的专属 shell。

zsh 官方网站:https://www.zsh.org/
zsh GitHub 仓库:https://github.com/zsh-users/zsh

dash

dash(Debian Almquist Shell)是一个轻量级、快速的 POSIX 兼容 Shell,主要设计目标是高效、快速地执行脚本而不是用户交互。它是由 NetBSD 上的 ash 发展而来的,并在 1997 年被移植到 Linux 上,同时在 2002 年更名为 dash。此 shell 因其执行速度快、占用资源少、完全兼容 POSIX 1 标准等特点,导致它在统脚本和启动脚本中应用广泛,但在日常使用中几乎很少看到它的身影。

dash 官方网站:http://gondor.apana.org.au/~herbert/dash/
dash 代码仓库:https://git.kernel.org/pub/scm/utils/dash/dash.git

fish

fish(Friendly Interactive Shell)是一种专注于用户体验的现代 Shell,最早由 Axel Liljencrantz 开发,并于 2005 年首次发布。它提供了丰富的交互功能和直观的设计,使 Shell 使用更加友好和便捷。相比如传统的 shell,它支持语法高亮、快捷键丰富、插件和主题支持也还行。总之,fish 是一种注重用户体验的 Shell,适合希望获得更直观和美观的命令行体验的用户,尤其是对日常命令行操作有较高要求但不需要严格 POSIX 兼容性的用户。

fish 官网网站:https://fishshell.com
fish GitHub 仓库:https://github.com/fish-shell/fish-shell


  1. POSIX(Portable Operating System Interface for Unix)就是 便携式操作系统接口,是由 IEEE 制定的一组在 Unix 系统和其他类 Unix 操作系统提供统一的接口的标准。它规范了操作系统的 API、Shell 和工具,确保软件在符合 POSIX 的系统上可以跨平台运行。 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/912540.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ -- 多态与虚函数

多态 概念 多态(polymorphishm):通常来说,就是指事物的多种形态。在C中,多态可分为编译时多态(静态多态)和运行时多态(动态多态),这里我们重点讲的是运行时多…

利用游戏引擎的优势

大家好,我是小蜗牛。 在当今快速发展的游戏产业中,选择合适的游戏引擎对开发者来说至关重要。Cocos Creator作为一款功能强大且灵活的游戏引擎,为开发者提供了丰富的工具和资源,使他们能够高效地开发出优秀的游戏。本文将探讨如何…

uniapp配置h5路由模式为history时404

为了不让URL中出现#,让uniapp项目配置h5路由模式为hisory 然而本地好好的,放到服务器上却404了。 解决方法是给nginx配置一个伪静态: location /xxx-html/ {alias /home/nginx_web/xxx_new_html/;try_files $uri $uri/ /xxx-html/index.ht…

架构师备考-概念背诵(软件工程)

软件工程 软件开发生命周期: 软件定义时期:包括可行性研究和详细需求分析过程,任务是确定软件开发工程必须完成的总目标,具体可分成问题定义、可行性研究、需求分析等。软件开发时期:就是软件的设计与实现,可分成概要设计、详细设计、编码、测试等。软件运行和维护:就是…

小白docker入门简介

Dockerfile入门使用分享 一、docker是啥二、镜像仓库三、自定义镜像四、动手做机甲玩偶五、帮我做数学题六、计算功能的写法七、咒语翻译器八、放屁九、解决问题 一、docker是啥 最开始我和你一样,围着镜像、容器、docker的名词团团转,其实没那么复杂。…

一文学习Android中的Property

在 Android 系统中,Property 是一种全局的键值对存储系统,允许不同组件和进程间以轻量级的方式进行数据传递。它主要用于系统配置、状态标识等场景,使得不同进程能够通过属性的设置或获取来通信。property 的核心特性是快速、高效&#xff0…

node.js安装配置(Windows)

1、下载 CNPM Binaries Mirror 2、安装 3、验证 win R 进入cmd 4、配置环境变量 4.1、创建两个文件夹 4.2、安装目录进入cmd(配置全局属性) 配置两个命令: npm config set prefix "D:\liyunqing\nodejs\node_global"npm config set cache "D:\l…

mp3格式音频怎么做成二维码?扫码获取音频文件的制作方法

随着二维码的广泛使用,现在很多内容都会通过生成二维码的方式来传输内容,通过这种方式可以更快捷的实现内容分享,简化其他人获取内容的流程,有效提高效率。音频是目前常见的一种内容分享方式,比如录音、听力、音乐等类…

【css flex 多行均分有间隙布局】

小程序、web均可使用&#xff0c;我当前用的是小程序 <view class"job_tab_container flex_between"><view class"job_tab_item"></view><view class"job_tab_item"></view><view class"job_tab_item&qu…

单臂路由技术,eNSP实验讲解

单臂路由技术&#xff0c;eNSP实验讲解 一、简要介绍1、概念2、工作原理3、优点4、缺点5、应用场景举例 二、eNSP仿真实验1、步骤一&#xff1a;2、步骤二&#xff1a;3、步骤三&#xff1a;4、步骤四&#xff1a; 三、总结。 一、简要介绍 1、概念 单臂路由&#xff08;Rout…

微服务day03

导入黑马商城项目 创建Mysql服务 由于已有相关项目则要关闭DockerComponent中的已开启的项目 [rootserver02 ~]# docker compose down WARN[0000] /root/docker-compose.yml: version is obsolete [] Running 4/4✔ Container nginx Removed …

Mac如何实现最简单的随时监测实时运行状态的方法

Mac book有着不同于Windows的设计逻辑与交互设计&#xff0c;使得Mac book有着非常棒的使用体验&#xff0c;但是在Mac电脑的使用时间过长时&#xff0c;电脑也会出现响应速度变慢或应用程序崩溃的情况&#xff0c;当发生的时候却不知道什么原因导致的&#xff0c;想要查询电脑…

无需云端!国产开源大语言模型llama.cpp本地实战

作者&#xff1a;高瑞冬 注&#xff1a; 文章是2023年底写的。代码和运行方式虽有些旧&#xff0c;但基本原理一样。现在出来ollama&#xff0c;vllm等工具框架用来本地部署大模型&#xff0c;顺便更新一下。 [TOC](最后有彩蛋) 背景 上海人工智能实验室与商汤科技…

初始JavaEE篇 —— 网络编程(2):了解套接字,从0到1实现回显服务器

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 TCP 与 UDP Socket套接字 UDP TCP 网络基础知识 在一篇文章中&#xff0c;我们了解了基础的网络知识&#xff0c;网络的出…

PVE纵览-从零开始:了解Proxmox Virtual Environment

PVE纵览-从零开始&#xff1a;了解Proxmox Virtual Environment 文章目录 PVE纵览-从零开始&#xff1a;了解Proxmox Virtual Environment摘要什么是Proxmox Virtual EnvironmentPVE的核心功能PVE 优势如何开始使用PVEPVE应用案例总结 关键字&#xff1a; PVE、 虚拟机、 Pr…

08 Oracle数据库故障应对与恢复策略:全面掌握RMAN恢复方法

文章目录 Oracle数据库故障应对与恢复策略&#xff1a;全面掌握RMAN恢复方法一、故障场景及恢复策略1.1 实例失败1.2 介质故障1.3 数据丢失 二、RMAN恢复方法详解2.1 全库恢复2.2 增量恢复2.3 时间点恢复 三、实践与总结 Oracle数据库故障应对与恢复策略&#xff1a;全面掌握RM…

MYSQL隔离性原理——MVCC

表的隐藏字段 表的列包含用户自定义的列和由系统自动创建的隐藏字段。我们介绍3个隐藏字段&#xff0c;不理解也没有关系&#xff0c;理解后面的undo log就懂了&#xff1a; DB_TRX_ID &#xff1a;6 byte&#xff0c;最近修改( 修改/插入 )事务ID&#xff0c;记录创建这条记…

Git超详细教程

Git初始 概念 一个免费开源&#xff0c;分布式的代码版本控制系统&#xff0c;帮助开发团队维护代码 作用 记录代码内容&#xff0c;&#xff0c;切换代码版本&#xff0c;多人开发时高效合并代码内容 如何学&#xff1a; 个人本机使用&#xff1a;Git基础命令和概念 多…

BK3432芯片SPI方式烧录固件方法

前言 本文介绍 BK3432 芯片的烧录授权。该芯片支持的固件烧录方式为 SPI 烧录 。 BK3432 的固件主要由三部分组成&#xff1a;boot stack app&#xff0c;其中&#xff1a; bk3432_ble_app.bin&#xff1a;生成的 App 部分的原始 bin 文件bk3432_ble_app_app.bin&#xff1…

网站架构知识之Ansible进阶(day022)

1.handler触发器 应用场景&#xff1a;一般用于分发配置文件时候&#xff0c;如果配置文件有变化&#xff0c;则重启服务&#xff0c;如果没有变化&#xff0c;则不重启服务 案列01&#xff1a;分发nfs配置文件&#xff0c;若文件发生改变则重启服务 2.when判断 用于给ans运…