2.1 > Shell 是什么、如何更熟练的使用 Bash Shell

Shell 基础知识

Shell是计算机操作系统中的一个命令行解释器,由C语言编写,用于用户与操作系统之间进行交互。用户可以通过Shell输入命令,操作系统接收到这些命令后执行相应的操作。Shell一般还提供了编程语言的基本功能,允许用户编写脚本来自动执行任务。

如下图,当用户在Shell上输入命令后,Shell将负责把命令转换成Kernel能够理解的语句交给Kernel来执行
在这里插入图片描述
Shell有多种类型,最常见的有以下几种:

  • Bash(Bourne Again Shell):大多数Linux发行版中默认的Shell,支持丰富的功能和脚本编写。
  • Zsh(Z Shell):与Bash相似,但提供了更多的功能和可配置性。只有少数发行版设置为了默认Shell,如Kali Linux。
  • PowerShell:Windows系统的命令行Shell,集成了.NET框架,支持面向对象的脚本编写。
  • Sh(Bourne Shell):早期的Shell,Bash是其扩展版。

与Shell有关的命令:

[root@demo ~]$ echo $SHELL	 	# 查看当前所使用的Shell类型
/bin/bash[root@demo ~]$ chsh -l		# 列出当前系统所安装的Shell类型有哪些
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/usr/bin/zsh
/bin/zsh[test@demo ~]$ chsh -s /bin/zsh		#更改当前Shell类型
正在更改 test 的 shell。
密码:
shell 已更改。

关于Bash,为什么众多发行版默认选择了Bash??

  • 兼容性好,能向后兼容早期的Sh,能够使用大量已有的脚本。
  • 支持复杂的脚本编写,提供如 if … else … 、for 等丰富的编程语言功能。
  • 强大的历史命令记录和自动补全功能。
  • 简单,零基础都能学会(相比于zsh等其他shell)。
  • 丰富的环境变量和内建命令 等等。

Bash 终端的格式如图:
在这里插入图片描述

  • 目录位置:”~“ 表示当前位置为用户家目录,普通用户在 /home/[用户名] ,root 用户在 /root 。
  • 当前用户标识:”#“ 表示当前用户为 root 用户, “$” 表示当前用户为普通用户,需注意每种shell类型的标识不一定相同。

与Bash有关的常用命令:

[test@demo ~]$ help			#使用 help 查看当前所有的内建命令
GNU bash,版本 4.4.20(1)-release (x86_64-redhat-linux-gnu)
这些 shell 命令是内部定义的。请输入 `help' 以获取一个列表。
......[test@demo ~]$ help cd			#查看一个内建命令的帮助手册
cd: cd [-L|[-P [-e]] [-@]] [目录]改变 shell 工作目录。改变当前目录至 DIR 目录。默认的 DIR 目录是 shell 变量 HOME 的值。
......
[test@demo ~]$ help mkdir		# 查看一个非内建命令
-bash: help: 没有与 `mkdir` 匹配的帮助主题。尝试 `help help``man -k mkdir``info mkdir`。[test@demo ~]$ man cd			# 使用 man 命令可以查看更加详尽的命令说明,前提是英文不错[test@demo ~]$ type cd			# 使用 type 查看一个命令是不是内建命令
cd 是 shell 内建
[test@demo ~]$ type -t mkdir		# 可以使用 -t 选项简略查看, 详细使用方法可以请使用 --help 帮助
file# 支持多命令的执行
[test@demo ~]$ mkdir dir1; cd dir1; touch demo		# 使用 ; 连接,前一个命令无论成功失败,后一个命令都会执行
[test@demo ~]$ tree dir1
dir1
└── demo# 如果命令之间存在相关性,则可以使用 && 或 || 来连接
[test@demo ~]$ mkdir dir1 && touch dir1/demo1		# 使用 && 连接,当前一个成功才会执行后一个
[test@demo ~]$ tree dir1
dir1
└── demo1[test@demo ~]$ ls
[test@demo ~]$ cat demo || touch demo		# 使用 || 连接,当前一个成功则后一个不会执行,当前一个失败后一个才会执行
cat: demo: 没有那个文件或目录
[test@demo ~]$ ls
demo[test@demo ~]$ touch demo1 \		# 支持命令的多行输入, 使用 \ 符号作为每一行的结尾
> demo2 \
> demo3
[test@demo ~]$ ls
demo1  demo2  demo3[test@demo ~]$ history			# 使用 history 查看历史命令,它读取的是用户家目录下的 .bash_history 文件的内容1  touch 12  history[test@demo ~]$ env		# 使用 env ( 或 printenv ) 查看当前 shell 的环境变量
LS_COLORS=rs=0:di=38;5;33:ln=38;5; ......# 使用 alias 创建别名,系统默认创建了 ll、rm、mv 的别名,可在家目录下的 .bashrc 文件中查看
[test@demo ~]$ alias la="ls -a"		# 相反,可以使用 unalias 删除别名
[root@demo ~]$ la		# 执行通过 alias 自定义的命令
.  ..  anaconda-ks.cfg  .bash_logout  .bash_profile  .bashrc  .viminfo[root@demo ~]$ export HELLO="hello"		# 使用 export 设置环境变量,仅在当前进程和其子进程中有效,听不懂就看下面的例子
# 什么叫在其进程和其子进程中生效,请通过下面的例子理解
[root@demo ~]$ WORLD="world"		# 直接设置变量,此变量仅在当前 bash 进程起作用
[root@demo ~]$ echo -e '#!/bin/bash \n echo $HELLO \n echo $WORLD' > 2  # 创建了 demo 文件,在其中执行两个 echo 命令
[root@demo ~]$ bash demo		# 使用 bash (或 ./ ) 命令来执行文件,bash 命令会创建一个子进程来执行该文件
hello# world 并没有打印
[root@demo ~]$ source demo		# 使用 source ( 或 . ) 命令来执行文件,该文件将被放在当前进程来执行
hello
world
# 上述例子说明,WORLD 变量的作用域只有本进程,而 export 定义的变量将是整个 bash 进程树

熟悉 Bash 在加载流程中可能需要用到的文件

  • 对于登录类型的加载,就是用户通过 SSH 或者 TTY 终端的方式进入而加载的 Bash 环境。Bash 将会按照如下顺序来加载配置文件:
    • 首先读取系统配置文件 /etc/profile,此文件所有用户都会加载,加载此文件的时候,会递归加载 /etc/profile.d 目录的文件。
    • 其次将依次读取用户配置文件 ~/.bash_profile 、 ~/.bash_login 、 ~/.profile,这些文件均在用户家目录下,用于每个用户自定义其 Bash 初始化环境或脚本等。
    • 最后加载 ~/.bashrc 文件,此文件一般通过其他文件手动加载(加载此文件的时候,还可能会递归手动加载 /etc/bashrc 文件),如通过 ~/.bash_profile 文件来加载它,若此文件没有被其他文件(如 ~/.bash_profile)手动加载,则登录时将不会加载此文件。
    • 当用户注销登录时,将加载 /etc/bash.bash_logout 和 ~/.bash_logout 两个文件。

注意: 这些文件或者目录可能并不存在,具体要看发行版本

  • 对于非登录类型的加载,就是指此 Bash 是通过其他程序创建或唤醒的,此种情况下只会加载 ~/.bashrc ,和上面一样,递归加载 /etc/bashrc 文件需要用户在 ~/.bashrc 文件中显式的指定。

与 Bash 相关文件的释义

除了我们常见的与 Bash 配置和执行相关的文件如 ~/.bashrc、/etc/profile、/etc/bashrc 等之外,Bash 还涉及许多其他文件,涵盖用户配置、历史记录、别名定义、环境变量、自动补全、登出清理等。以下是与 Bash 相关的一些文件:

除了黄色标记需要熟悉,其他知道就行了

  • 用户相关的配置文件
    • ~/.bash_profile:用于登录 Shell 时加载的用户个性化配置。一般会设置环境变量、调用 ~/.bashrc 等。
    • ~/.bash_login:登录 Shell 时的备用配置文件。如果没有 ~/.bash_profile,则加载此文件。
    • ~/.profile:某些非 Bash Shell 也使用的通用登录配置文件。如果没有 ~/.bash_profile 和 ~/.bash_login,Bash 会尝试加载此文件。
    • ~/.bashrc:用于非登录 Shell 的用户配置文件。常用于定义别名、函数、环境变量等。一般通过 ~/.bash_profile 加载。
  • 全局配置文件
    • /etc/profile:系统范围的登录 Shell 配置文件,所有用户都会加载。通常设置全局环境变量并调用 /etc/profile.d/ 中的脚本。
    • /etc/bashrc(或 /etc/bash.bashrc):系统范围的非登录 Shell 配置文件。通常定义系统范围的别名、Shell 选项等。一般通过 ~/.bashrc 加载。
  • 自动补全相关的文件
    • /etc/bash_completion:自动补全配置文件,用于定义命令的自动补全规则。
    • /etc/bash_completion.d/:目录中包含为特定命令定义的自动补全脚本(比如 git、yum 等)。这些脚本帮助提供命令参数的补全功能。
  • 历史记录相关的文件
    • ~/.bash_history:记录用户执行的命令历史。当用户执行 history 命令时,系统会读取这个文件。
    • HISTFILE 环境变量:指定历史记录文件的路径,默认是 ~/.bash_history,但你可以通过设置 HISTFILE 改变位置。
  • 登出相关的文件。
    • ~/.bash_logout:当用户退出登录 Shell 时,执行该文件中的命令。通常用于清理操作,比如清除历史记录、打印退出消息等。
  • 别名相关文件
    • ~/.bash_aliases:用户自定义别名的文件。某些发行版可能会推荐在这个文件中定义别名,而不是直接在 ~/.bashrc 中。这些别名会在 ~/.bashrc 中被加载。
    • /etc/profile.d/:该目录中可以放置全局别名文件或其他脚本配置。
  • 环境变量相关的文件
    • /etc/environment:用于定义系统范围的环境变量。不同于 /etc/profile,它不会执行 Shell 命令,只用于简单地定义键值对形式的变量。
    • ~/.bash_profile 、 ~/.bashrc、/etc/profile:这些文件也常用于设置环境变量,通过 export 来使变量对所有子进程可见。
  • 启动和初始化相关的文件
    • /etc/rc.local:通常用于定义系统启动时执行的命令。在较老的 Linux 系统中常见,现代发行版中有时被替代为 systemd 的 unit 文件。
    • ~/.inputrc:Bash 使用 GNU Readline 库处理输入,该文件定义了 Readline 的配置,比如键盘快捷键和输入编辑规则。
  • 其他 Bash 相关文件
    • ~/.bash_aliases:某些发行版会推荐将别名放入该文件,并在 ~/.bashrc 中自动加载。
    • /etc/skel/.bashrc 和 /etc/skel/.bash_profile:这些是系统中默认的 Bash 配置文件模板,当新用户账户被创建时,这些文件会被复制到新用户的主目录中,作为初始的 ~/.bashrc 和 ~/.bash_profile。
  • 用户自定义函数文件
    • ~/.bash_functions:用户可以定义自己的 Shell 函数并放在这个文件中,很多发行版推荐通过 .bashrc 加载它。
  • bash命令相关
    • /usr/bin/bash:这是 Bash Shell 程序的二进制文件,位于系统的二进制路径下,用户每次运行 Bash 时都会调用这个文件。

注意: 这些文件或文件夹可能并不存在,每个发行版并不一样,要视具体情况而定

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Mac 上将 MOV 格式转换为 MP4 格式的简易指南】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

R语言笔记(四):函数

文章目录 一、Function basics1、Creating your own function2、Function structure3、Using your created function4、Multiple inputs5、Default inputs 二、Return values and side effects1、Returning more than one thing2、Side effectsExample of side effect: plot 三…

从零开始学python必看,最强“Python编程三剑客(pdf)”

目录 三剑客PDF传送门:三剑客 第一本:《Python编程:从入门到实践》 1.1《Python编程:从入门到实践》第一部分:基础知识 1.2《Python编程:从入门到实践》第二部分:项目 第二本:《…

使用LM Studio在ZBlog基于大模型原创文章上稿进行SEO优化

在当今内容创作需求日益增长的背景下,如何高效地进行文章生成与发布,成为众多开发者关注的焦点。通过结合Python脚本与ZBlog平台,能够实现从分类与标签的自动化管理,到文章生成与发布的一整套流程。 本文详细讲解了如何进行自动化文章生成与发布的基础配置、项目搭建与实际…

Metasploit渗透测试之模块学习与开发

# 概述 Metasploit 框架采用模块化架构,即所有漏洞利用、有效载荷、编码器等都以模块形式存在。模块化架构使框架功能的扩展更加容易。任何程序员都可以开发自己的模块,并将其轻松移植到框架中。 # 1、使用辅助模块 在之前的"信息收集和扫描 &qu…

【设计模式-原型】

**原型模式(Prototype Pattern)**是一种创建型设计模式,旨在通过复制现有对象的方式来创建新对象,而不是通过实例化类来创建对象。该模式允许对象通过克隆(复制)来创建新的实例,因此避免了重新创…

sm3填充

完成下面任务(10分) 1. 使用 OpenSSL 生成长度为70字节的随机数,最后添加“你的8位学号姓名首字母”的 ASCII 码,得到HEX字符串S1,提交S1。(4 分) [wzyLAPTOP-PRC71A0C ~]$ openssl rand -hex…

QT-使用QSS美化UI界面

一、QSS简介: Qt Style Sheet:Qt样式表,用来自定义控件外观的一种机制,可以把他类比成CSS(CSS主要功能与最终目的都是能使界面的表现与界面的元素分离)。QSS机制使应用程序也能像web界面那样随意地改变外观…

构建后端为etcd的CoreDNS的容器集群(二)、下载最新的etcd容器镜像

在尝试获取etcd的容器的最新版本镜像时,使用latest作为tag取到的并非最新版本,本文尝试用实际最新版本的版本号进行pull,从而取到想的最新版etcd容器镜像。 一、用latest作为tag尝试下载最新etcd的镜像 1、下载镜像 [rootlocalhost opt]# …

基于vue框架的的高校消防设施管理系统06y99(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:设备分类,设备信息,维修人员,报修信息,维修进度,院系,消防知识,培训记录,培训信息,备件信息,备件申请,派发信息,采购信息 开题报告内容 基于Vue框架的高校消防设施管理系统开题报告 一、项目背景与意义 随着高校规模的不断扩大和校园建…

OpenCV和HALCON

OpenCV和HALCON是两种广泛用于图像处理和计算机视觉的开发库,它们各有优缺点,适合不同的应用场景。以下是两者的比较: 1. 开发背景与定位 OpenCV (Open Source Computer Vision Library): 开源库,最初由Intel开发&…

视频处理-2D卷积核处理3D时序

2D卷积核处理3D(时序)数据_pseudoconv3d-CSDN博客

【EmbeddedGUI】PFB设计说明

PFB设计说明 背景介绍 一般来说,要实现屏幕显示,就是向特定像素点写入颜色值,最简单的办法就是直接通过SPI接口,向显示器芯片的特定缓存地址,写入像素点。一般来说,显示器芯片会提供2个基本操作API&#…

qt QNetworkProxy详解

一、概述 QNetworkProxy通过设置代理类型、主机、端口和认证信息,可以使应用程序的所有网络请求通过代理服务器进行。它支持为Qt网络类(如QAbstractSocket、QTcpSocket、QUdpSocket、QTcpServer、QNetworkAccessManager等)配置网络层代理支持…

数据仓库基础概念

数据仓库 概念 数据仓库(Data Warehouse, DW)是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合。它是为满足企业决策分析需求而设计的。 面向主题:数据仓库围绕特定的主题组织数据,例如“销售”或“人力资源”&am…

springboot自动初始化表结构及其数据

1.通过配置文件进行初始化 mode:控制 SQL 初始化的模式,取值可以是: never:禁用初始化。embedded:仅在嵌入式数据库中初始化。always:每次应用启动时都初始化。 spring:sql:init:platform: mysqlmode: a…

HarmonyOS NEXT开发实战:实现高效下拉刷新与上拉加载组件(二)刷新核心逻辑与空页面集成

前言: 在上一篇文章中,我们深入探讨了如何在HarmonyOS中实现一个功能完备的空页面组件。现在,我们将进入下拉刷新和上拉加载功能的核心逻辑实现。这不仅仅是技术实现,更是对用户体验的深刻理解。本文将详细介绍如何将空页面与下拉刷新、上拉加载逻辑相结合,打造一个既高效…

学成在线实战

#1024程序员节|征文# 一、Bug修改 在实战之前,老师留了一个bug,这个bug出现的原因是因为在查询课程计划时,使用的是Inner join查询,所以当章节下面没有小节的时候,是查不出来数据的,只需要将其…

PHP企业门店订货通进销存系统小程序源码

订货通进销存系统,企业运营好帮手! 📦 开篇:告别繁琐,企业运营新选择 嘿,各位企业主和创业者们!今天我要给大家介绍一款超实用的企业运营神器——“订货通进销存系统”。在这个数字化时代&…

YOLOv5_DeepSORT实现电动自行车头盔佩戴检测系统

获取更多完整项目代码数据集,点此加入免费社区群 : 首页-置顶必看 文档说明 本文档是毕业设计——基于深度学习的电动自行车头盔佩戴检测系统的开发环境配置说明文档,该文档包括运行环境说明以及基本环境配置两大部分。在程序运行前请认真查…