认识BASH这个Shell

news2024/12/24 8:43:13

文章目录

  • 认识BASH这个Shell
    • 硬件、内核与shell
    • 为什么要学命令行模式的Shell?
    • Bash Shell的功能
      • 命令与文件补全(TAB)
      • 命令别名设置(alias)
      • 历史命令(history)
      • 任务管理、前台、后台控制(jobs,fg,bg)
      • 通配符
      • 程序化脚本
    • 查询命令是否为Bash shell 的内置命令(type)
      • 使用案例
    • 命令的执行与快速编辑按钮

认识BASH这个Shell

管理整个计算机硬件的其实是操作系统的内核(kernel),这个内核是需要保护的。所以我们一般只能通过Shell来跟内核沟通,以让内核完成我们所想要实现的任务。那么系统有多少shell可用呢?为什么要使用bash?

硬件、内核与shell

什么是shell?只要摸过计算机,对于操作系统(不论是Linux、UNIX或是Windows)有点概念的朋友大多听过这个名词,因为只要有操作系统那么就离不开shell这个东西。不过,在讨论shell之前,我们先来了解一下计算机的运行情况吧!举个例子:当你要计算机播放出音乐的时候,你的计算机需要什么东西?

  1. 硬件:当然就是需要你硬件有声卡这个设备,否则怎么会有声音。
  2. 内核管理:操作系统的内核可以支持这个芯片组,当然还需要提供芯片的驱动程序
  3. 应用程序:需要用户(就是你)输入发生声音的命令

这就是基本的一个输出声音所需要的步骤,也就是说,你必须要输入一个命令之后,硬件才会通过你执行的命令来工作。那么硬件如何知道你执行的命令?那就是内核(kernel)的管理工作了,也就是说,我们必须要通过Shell将我们输入的命令与内核沟通,好让内核可以控制硬件来正确无误第工作。

img

操作系统其实就是一组软件,由于这组软件在控制整个硬件与管理系统的活动检测,如果这组软件能被用户随意使用,若用户应用不当,将会使得整个系统崩溃

但是用户总是需要让用户使用操作系统的,所以就有了在操作系统上面发展的应用程序。用户可以通过应用程序来指挥内核,让内核完成我们所需要的硬件任务。

为什么要学命令行模式的Shell?

学习命令行模式的shell有以下几个原因:

  1. 提高效率:在命令行模式下,可以通过简单的命令完成复杂的任务,比如批量修改文件名、查找文件、处理文本等。这些命令可以通过脚本自动化执行,提高操作效率。
  2. 方便远程操作:通过ssh等远程登录工具,可以在远程机器上使用命令行模式的shell,方便远程操作,比如服务器管理、文件传输等。
  3. 更好地理解计算机:学习命令行模式的shell可以更好地理解计算机的底层工作原理,比如文件系统、进程管理等。
  4. 更好地理解编程:很多编程语言都可以在命令行模式下编写和执行,学习命令行模式的shell可以更好地理解编程语言的底层原理和编写脚本的技巧。
  5. 适用于各种操作系统:命令行模式的shell是各种操作系统都支持的,学习命令行模式的shell可以适用于各种操作系统,比如Linux、Mac、Windows等。

Bash Shell的功能

不论你是使用的哪个Linux发行版,你都难逃要学习bash的宿命,那么这个shell有什么好处呢,为什么选择它为默认shell?bash的优点主要有下面几个:

命令与文件补全(TAB)

在bash环境中使用【TAB】是一个很好的习惯,可以让你少打很多字,还可以保证你输入的都是正确的。

  • 【TAB】接在一串命令的第一个字后面,则为命令补全
  • 【TAB】接在一串命令的第二个字后面,则为文件补全

所以我想知道【c】开头的命令呢?就按下【c [TAB] [TAB]】就行了。

命令别名设置(alias)

假如我需要知道这个目录下面所有文件(包含隐藏文件)及所有的文件属性,那么我就必须要执行【ls -al】 这样的命令,很麻烦,我们就可以使用命令别名的方式。例如想让输入 ls 替换为输入 ls -al,那么该如何做呢?

[root@localhost ~]# alias ls='ls -al'
[root@localhost ~]# ls
总用量 48
dr-xr-x---.  3 root root  179 421 16:48 .
dr-xr-xr-x. 17 root root  224 45 20:11 ..
-rw-------.  1 root root 4765 421 10:07 .bash_history
-rw-r--r--.  1 root root   18 420 08:44 .bash_logout
-rw-r--r--.  1 root root  193 420 08:44 .bash_profile
-rw-r--r--.  1 root root  231 420 08:44 .bashrc
drwxr-----.  3 root root   19 420 10:39 .pki
-rw-r--r--.  1 root root   16 421 09:53 utf8zw
-rw-------.  1 root root 4881 421 16:48 .viminfo
-rw-r--r--.  1 root root   83 420 20:16 .vimrc
-rw-r--r--.  1 root root   16 421 09:36 zw
-rw-r--r--.  1 root root   11 421 09:41 zwbig5
-rw-r--r--.  1 root root   11 421 09:43 zwbig555

总所周知root可以删除(rm)任何数据,所以当你使用root的身份在工作时,需要特别小心,但是总有失手的时候,那么rm提供一个选项让我们确认是否删除文件就是-i的选项,所以你可以这样做

[root@localhost ~]# alias rm='rm -i'

这样使用rm的时候,就不用太担心会误删的情况,这也是命令别名的优点.。那么如何知道当前我设置了哪些别名呢?如下所示

[root@localhost ~]# alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls -al'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

那么怎么取消别名呢?如下所示

[root@localhost ~]# unalias ls
[root@localhost ~]# alias 
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

历史命令(history)

bash里面最棒的就是这个【history】命令它能够记录使用过的命令,我们只需要在命令行里按下【上下键】就可以找到前一个输入的命令。

image-20230421190227211

这么命令在哪里呢?在你的家目录内的【.bash_history】不过,需要留意的是,~/.bash_history记录的是前一次登录以前所执行的命令,而至于这一次登录所执行的命令都被存在内存中,当你成功的注销系统后,该命令才会记录到./bash_history中

如果我觉得每次输入history字符太多太麻烦,可以使用命令别名来设置

[root@localhost ~]# alias h='history'

这样输入h等于输入了history,那么history 有什么用法呢?

history [n]
history [-c]
history [-raw] histfiles
选项:
 n:数字,意思是【列出最近的n条命令】的意思
-c:将目前的shell中的所有history内容全部删除
-a:将目前新增的history命令新增histfiles中,若没有加histfiles,则默认写入~/.bash_history。
-r:将history的内容读到目前这个shell的history记录中
-w:将目前history记录的内容写入histfiles中。

使用案例

列出最近的3条数据

[root@localhost ~]# history 3
    8  echo $bash
    9  echo $PATH
   10  history 3

立刻将目前的数据写入histfiles.txt中

[root@localhost ~]# history -w histfiles.txt

那么这个history命令只能让我查询命令而已吗?当然不止,我们还可以利用相关的功能帮我们执行命令

!number 
!command
!!
什么意思呢?
number:执行第几条命令的意思
command:有最近的命令向前查找【命令串开头为command】的那个命令,并执行
!!:就是执行上一条命令

使用案例

[root@localhost ~]# h
    1  h
    2  cat
    3  cat -a zw
    4  whoaim
    5  whoami 
    6  echo $
    7  echo $LANG
    8  echo $bash
    9  echo $PATH
   10  history 3
   11  history -w
   12  ls
   13  echo $(HISTSIZE)
   14  history -w histfiles.txt
   15  cat histfiles.txt 
   16  h
[root@localhost ~]# !9   # 执行第9条命令
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/.local/bin:/root/bin

任务管理、前台、后台控制(jobs,fg,bg)

此内容可参考这篇博客https://blog.csdn.net/qq_52089863/article/details/129976536

使用前、后台的控制可以让任务进行的更加顺利,至于任务管理(jobs)的用途更为广泛,可以让我们随时将任务丢到后台执行,不怕使用[ctrl + c]来停掉更该程序,很不错。在单一登录的环境下,达到多任务的目的。

通配符

除了完整的字符串之外,bash还支持许多的通配符来帮助用户查询与命令执行。举例来说我想要知道/usr/bin 下面有多少以X开头的文件,可以使用【ls -l /usr/bin/*X】,此外还有其他可利用的通配符,这些都能够加快用户操作的速度。

程序化脚本

什么是程序化脚本,就是将你平时管理需要执行的连续命令写成一个文件,该文件并且可以通过交互式的方式来进行主机的检测工作,也可以借由shell提供的环境变量及相关的命令来进行设计。

查询命令是否为Bash shell 的内置命令(type)

那我怎么知道这这个命令到底是来自外部命令(指的是非bash所提供的命令)或是内置在bash中呢?可以用type这个命令来观察

type  [-tpa] name
选项:
  :不加任何参数时,type显示出name是外部命令还是bash内置命令。
-t:当加入 -t参数时,type将name以下面这些资源显示出它的意义。
    file :表示外部命令
    alias:表示该命令为命令别名所设置的名称
    builtin:表示该命令为bash的内置命令功能
-p:如果后面接的name为外部命令时,才会显示完整的文件名
-a:会由PATH变量定义的路径中,将所有含name的命令都列出来,包括alias

使用案例

查询下rm这个命令是否为bash内置?

[root@localhost ~]# type rm
rm`rm -i' 的别名       # 什么参数都没加,列出rm的最主要使用情况
[root@localhost ~]# type -t rm
alias
[root@localhost ~]# type -a rm
rm`rm -i' 的别名       # 最先展示的是rm的最主要使用情况
rm 是 /usr/bin/rm         # 外部命令在所在的路径

那么cd是bash的内置命令吗?

[root@localhost ~]# type cd
cd 是 shell 内嵌   # cd是shell的内置命令

命令的执行与快速编辑按钮

如果命令太长的话,如何用两行来输入?

[root@localhost ~]# cp -rf /etc/sysconfig/network-scripts/ifcfg-ens33 \
>  /home/csq/

上面这个命令是将网卡文件复制到 csq这个普通用户下,不过因为命令太长,就利用【\Enter】来将这个按键转义,让【Enter】不在具有执行的功能,好让命令可以继续下一行输入。需要注意的是[Enter]是紧挨着( \ )的,两者中间没有其他字符,因为( \ )仅转义紧接着的下一个字符而已。

如果成功转义[Enter]后,下一行最前面会出现 > 的符号,可以继续输入命令,也就是说,那个 > 是系统自动出现的,不需要你输入。

另外,当你需要执行的命令特别长,或是你输入了一串错误的信息时,你想要快速的将这串命令整个删除,一般来说,我们都是使用删除键。其实还有组合键可以使用。

组合键功能示范
[ctrl] + u/[ctrl] + k分别是从光标处向前删除命令串(ctrl + u)及向后删除命令串(ctrl + k)
[ctrl] + a/[ctrl] + e分别是让光标移动到整个命令串的最前面(ctrl + a) 或最后面(ctlr + e)

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

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

相关文章

前端--移动端布局--2移动开发之flex布局

目标: 能够说出flex盒子的布局原理 能够使用flex布局的常用属性 能够独立完成携程移动端首页案例 目录: flex布局体验 flex布局原理 flex布局父项常见属性 flex布局子项常见属性 写出网首页案例制作 1.flex布局体验 1.1传统布局与flex布局 传…

nacos 部署 配置

文章目录 一、Nacos简介 1、为什么叫Nacos2、Nacos是什么3、能干嘛4、去哪下二、安装并运行Nacos 2.1 基础环境及配置:三、Nacos作为服务注册中心演示 3.1 基于Nacos的服务提供者 2、POM文件3、YML文件4、主启动5、业务类6、测试7、nacos控制台3.2 基于Nacos的服务消…

[POJ - 1080 ]Palindrome(区间DP)

[POJ - 1080 ]Palindrome( 区间DP) 1、问题2、分析状态表示状态转移空间优化 3、代码 1、问题 给定一个字符串,通过添加最少的字符,使得这个字符串成为一个回文字符串。 2、分析 状态表示 f [ i ] [ j ] f[i][j] f[i][j]表示将…

2023年产品经理需要考的证书,NPDP含金量真高

产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是…

盖子的c++小课堂——第十七讲:递归

前言 通知一下,以后每周不定期更新,有可能是周六更新,也可能是周日吧,反正会更新的~~还有我新出的专栏《跟着盖子读论语》,记得订阅一下啊跟着盖子学《论语》_我叫盖子的盖鸭的博客-CSDN博客 三元表达式 三元表达式…

单链表中二级指针的使用以及单链表的增删查改操作

前言:在链表的构建中,链表的初始化和销毁为何需要使用一个二级指针,而不是只需要传递一个指针就可以了,其问题的关键就在于c语言的参数传递的方式是值传递 那么,这篇文章就来聊一聊在链表的初始化中一级指针的传递和二级指针的区别,并总结给出单链表的C语…

AutoCAD使用技巧

AutoCAD使用技巧 环境说明AutoCAD 导入EXCELAutoCAD移动对象到原点 环境说明 本文基于AutoCAD 2021版本。 AutoCAD 导入EXCEL 如果菜单栏隐藏点击显示菜单栏: 在excel中选中copy内容赋值,AutoCAD中选择:编辑-选择性粘贴-作为AutoCAD图元…

必用WhatsApp营销的4个理由

WhatsApp是世界上最受欢迎的消息传递应用程序。每天有1万新用户加入WhatsApp。各种规模的公司都利用该平台与世界各地的客户进行有效的沟通,这要归功于其广泛的覆盖范围、用户友好的设计和安全的端到端加密。因此,WhatsApp聊天机器人迅速普及。 1.为您的…

Kotlin的出现无疑是为了超越Java而存在

Kotlin的出现无疑是为了超越Java而存在。在Google I/O 2017中,Google 宣布 Kotlin 成为 Android 官方开发语言,背景就是Oracle告Google侵权使用java。众所周知,Java的跨平台的开发语言,得益于虚拟机。我比较关注Kotlin用于Android…

Python 使用pipreqs命令生成 `requirements.txt`报错

Python 使用pipreqs命令生成 requirements.txt报错:Fatal error in launcher: Unable to create process using ‘“E:\Anaconda\python.exe” “D:\Anaconda\Scripts\pipreqs.exe” ./ --encodingutf-8’: ??? 问题描述—Python 使用pipreqs命令生成 requireme…

47.对齐网格项目和轨道

首先我们先将模块1关闭,模块2使用CSS网格 display: none;.container--2 {/* STARTER */font-family: sans-serif;background-color: black;font-size: 40px;margin: 100px;width: 1000px;height: 600px;/* CSS GRID */display: grid;}然后我们常间一个三列两行的网…

STM32开发(十六)STM32F103 片内资源 —— 实时时钟RTC 详解

文章目录 一、基础知识点二、开发环境三、STM32CubeMX相关配置四、Vscode代码讲解五、结果演示串口显示乱码解决方案 一、基础知识点 本实验通过stm32片内资源RTC实现实时时钟,通过数码管显示时间。设定闹钟,实现准点报时。 数码管相关知识点&#xff1…

maven总结

maven maven1.构建依赖2.依赖冲突的规则3.可选依赖和排除依赖可选依赖排除依赖 4.依赖范围5.项目构建生命周期6.插件7.模块聚合8.模块继承9.属性(类似常量)(1) 自定义属性(2)直接调用内置属性 10.多个环境配…

PingPingPing

拿到题的时候我是没有丝毫的思路,可能是没有做过太多命令注入的题目,所以反应不过来 还是查看的别人的wp,得知这是一道有关命令注入的题目 通过页面提示传入ip并且利用管道符查看所有文件 但是当我们查看flag.php的时候发现页面过滤掉了空格 …

诊断DTC故障码两种形式的转换:符号转数字

诊断DTC code数据由3个字节组成:HighByte + MiddleByte + LowByte。有两种表现形式: 数字:三个字节值用16进制表示,比如0xC07304符号:这种形式更直观地用字符描述该DTC故障所属的系统,故障类型等信息我们重点讲一下符号的形式: 字符形式的DTC故障码,由7个字符组成,代…

Chatbox - 一款适用于 GPT-4 / GPT-3.5 (OpenAI API) 的桌面应用程序

简介 给大家推荐一款适用于 GPT-4 / GPT-3.5 (OpenAI API) 的桌面应用程 ChatBox,开源的 ChatGPT API (OpenAI API) 跨平台桌面客户端,Prompt 的调试与管理工具,也可以用作 ChatGPT Plus 平替。 下载 ► chatBox 下载安装 ⇲ 为什么不直接…

3D目标检测--PointPillars论文和OpenPCDet代码解读

文章目录 1. 论文动机2. PointPillars概述3. PointPillars模型3.1 Pillar Feature Net3.1.1 Pillar Feature Net模块理论解析3.1.2 Pillar Feature Net模块代码解析 3.2 Backbone(2D CNN)3.2.1 Backbone(2D CNN)模块理论解析3.2.2…

LeetCode 312. Burst Balloons【区间DP】困难

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

校验规则引擎

目录 一 架构设计图 二 表设计及数据展示 三 顶层接口 四 压测结果 五 其他规则引擎比较 适用场景:校验场景以及使用该思想进行可视化配置化开发(可大幅提高开发效率,长期维护简单) 例如:履约系统下单中的校验&…

C++(初识结束)

目录 4缺省参数 4.1缺省参数的概念 4.2缺省参数分类 4.3缺省参数的应用 5.函数重载 5.1函数重载概念 5.2c支持函数重载的原理-名字修饰(name Mangling) 6.引用 6.1引用概念 6.2引用特性 6.3常引用 6.4使用场景 6.4.1做参数 6.4.2做返…