【BASH】回顾与知识点梳理(一)

news2024/10/6 8:33:16

【BASH】回顾与知识点梳理 一

    • 前言
    • 一. 认识与学习 BASH
      • 1.1 硬件、核心与 Shell
      • 1.2 为何要学文字接口的 shell?
      • 1.3 系统的合法 shell 与 /etc/shells 功能
      • 1.4 Bash shell 的功能
      • 1.5 查询指令是否为 Bash shell 的内建命令: type
      • 1.6 指令的下达与快速编辑按钮

前言

不知道有没有小伙伴和笔者一样,bash命令看了一遍又一遍,当要写脚本的时候,还是会有些命令模糊,参数记不清。分析原因:一是学习的时候,只是对用到的命令或语法简单的查一下,应付当前的工作,而并没有进行整体梳理和构建完整的知识体系。第二点就是遗忘(笔者有时候记性真是差),遗忘的原因可能就是记忆的不深刻(笔者能够清晰的记着小时候第一次去幼儿园,上到一半翘课拿着好吃的去草地吃完回家的场景- -!)。

从本期开始,笔者将基于linux圣经《鸟哥的Linux私房菜》中的第十、十一、十二章,和马哥(马永亮)的部分网课内容来重新对自己的bash知识体系进行梳理,力求夯实基础。期间也会引用一些工作中遇到的高手写的脚本作为参考学习。闲言少絮,让我们开始新的旅程!

一. 认识与学习 BASH

管理整个计算机硬件的其实是操作系统的核心 (kernel),这个核心是需要被保护的! 所以我们一般使用者就只能透过 shell 来跟核心沟通,以让核心达到我们所想要达到的工作。 那么系统有多少 shell 可用呢?为什么我们要使用 bash 啊?

1.1 硬件、核心与 Shell

这应该是个蛮有趣的话题:『什么是 Shell 』?相信只要摸过计算机,对于操作系统 (不论是 Linux 、Unix 或者是 Windows) 有点概念的朋友们大多听过这个名词,因为只要有『操作系统』那么就离不开 Shell 这个东西。不过,在讨论 Shell 之前,我们先来了解一下计算机的运作状况吧! 举个例子来说:当你要计算机传输出来『音乐』的时候,你的计算机需要什么东西呢?

  1. 硬件:当然就是需要你的硬件有『声卡芯片』这个配备,否则怎么会有声音;
  2. 核心管理:操作系统的核心可以支持这个芯片组,当然还需要提供芯片的驱动程序啰;
  3. 应用程序:需要使用者 (就是你) 输入发生声音的指令啰!

这就是基本的一个输出声音所需要的步骤!也就是说,你必须要『输入』一个指令之后, 『硬件』才会透过你下达的指令来工作!那么硬件如何知道你下达的指令呢?那就是 kernel (核心) 的控制工作了!也就是说,我们必须要透过『 Shell 』将我们输入的指令与 Kernel 沟通,好让 Kernel 可以控制硬件来正确无误的工作! 基本上,我们可以透过底下这张图来说明一下:

在这里插入图片描述
操作系统其实是一组软件,由于这组软件在控制整个硬件与管理系统的活动监测, 如果这组软件能被用户随意的操作,若使用者应用不当,将会使得整个系统崩溃!因为操作系统管理的就是整个硬件功能嘛! 所以当然不能够随便被一些没有管理能力的终端用户随意使用啰

但是我们总是需要让用户操作系统的,所以就有了在操作系统上面发展的应用程序啦!用户可以透过应用程序来指挥核心, 让核心达成我们所需要的硬件任务!
在这里插入图片描述
我们可以发现应用程序其实是在最外层,就如同鸡蛋的外壳一样,因此这个咚咚也就被称呼为壳程序 (shell) 啰!

其实壳程序的功能只是提供用户操作系统的一个接口,因此这个壳程序需要可以呼叫其他软件才好。我们可以透过壳程序 (就是指令列模式) 来操作这些应用程序,让这些应用程序呼叫核心来运作所需的工作哩! 这样对于壳程序是否有了一定的概念了?

也就是说,只要能够操作应用程序的接口都能够称为壳程序。狭义的壳程序指的是指令列方面的软件,包括本章要介绍的 bash 等。 广义的壳程序则包括图形接口的软件!因为图形接口其实也能够操作各种应用程序来呼叫核心工作啊! 不过在本章中,我们主要还是在使用 bash 啦!

1.2 为何要学文字接口的 shell?

文字接口的 shell 是很不好学的,但是学了之后好处多多!
X Window 与 web 接口的工具,他的接口虽然亲善,功能虽然强大, 但毕竟他是将所有利用到的软件都整合在一起的一组应用程序而已, 并非是一个完整的套件,所以某些时候当你升级或者是使用其他套件管理模块 (例如 tarball 而非 rpm 文件等等) 时,就会造成设定的困扰了。甚至不同的 distribution 所设计的 X window 接口也都不相同,这样也造成学习方面的困扰。文字接口的 shell 就不同了!几乎各家 distributions 使用的 bash 都是一样的! 如此一来, 你就能够轻轻松松的转换不同的 distributions ,就像武侠小说里面提到的『一法通、万法通!』

此外,Linux 的管理常常需要透过远程联机,而联机时文字接口的传输速度一定比较快, 而且,较不容易出现断线或者是信息外流的问题,因此,shell 真的是得学习的一项工具。而且,他可以让更深入 Linux ,更了解他,而不是只会按一按鼠标而已!所谓『天助自助者!』多摸一点文本模式的东西,会让你与 Linux 更亲近呢!

1.3 系统的合法 shell 与 /etc/shells 功能

知道什么是 Shell 之后,那么我们来了解一下 Linux 使用的是哪一个 shell 呢?什么!哪一个?难道说 shell 不就是『一个 shell 吗?』哈哈!那可不!由于早年的 Unix 年代,发展者众,所以由于shell 依据发展者的不同就有许多的版本,例如常听到的 Bourne SHell (sh) 、在 Sun 里头预设的 C SHell、 商业上常用的 K SHell、, 还有 TCSH 等等,每一种 Shell 都各有其特点。至于 Linux 使用的这一种版本就称为『 Bourne Again SHell (简称 bash) 』,这个 Shell 是 Bourne Shell 的增强版本,也是基准于 GNU 的架构下发展出来的呦!

在介绍 shell 的优点之前,先来说一说 shell 的简单历史吧:
第一个流行的 shell 是由 Steven Bourne 发展出来的,为了纪念他所以就称为 Bourne shell ,或直接简称为 sh
而后来另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计依附于 BSD 版的 Unix 系统中的 shell ,这个 shell 的语法有点类似 C 语言,所以才得名为 C shell ,简称为 csh !由于在学术界 Sun 主机势力相当的庞大,而 Sun 主要是 BSD 的分支之一,所以 C shell 也是另一个很重要而且流传很广的 shell 之一

那么目前我们的 Linux (以 CentOS 7.x 为例) 有多少我们可以使用的 shells 呢? 你可以检查一下/etc/shells 这个文件,至少就有底下这几个可以用的 shells (鸟哥省略了重复的 shell 了!包括 /bin/sh 等于 /usr/bin/sh 啰!):

[root@node-135 ngx_on_cpu]# cat /etc/shells
/bin/sh (已经被 /bin/bash 所取代)
/bin/bash (就是 Linux 预设的 shell)
/bin/tcsh (整合 C Shell ,提供更多的功能)
/bin/csh (已经被 /bin/tcsh 所取代)
/usr/bin/sh
/usr/bin/bash

不同版本的centos,自带的shells可能略有不同

虽然各家 shell 的功能都差不多,但是在某些语法的下达方面则有所不同,因此建议你还是得要选择某一种 shell 来熟悉一下较佳。 Linux 预设就是使用 bash ,所以最初你只要学会 bash 就非常了不起了! _! 另外,咦!为什么我们系统上合法的 shell 要写入 /etc/shells 这个文件啊? 这是因为系统某些服务在运作过程中,会去检查使用者能够使用的 shells ,而这些 shell 的查询就是藉由/etc/shells 这个文件啰!

我这个使用者什么时候可以取得 shell 来工作呢?还有, 我这个使用者预设会取得哪一个 shell 啊?还记得我们在第四章的在终端界面登入 linux 小节当中提到的登入动作吧? 当我登入的时候,系统就会给我一个 shell 让我来工作了。 而这个登入取得的 shell 就记录在/etc/passwd 这个文件内!这个文件的内容是啥?

[root@node-135 ngx_on_cpu]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
...

如上所示,在每一行的最后一个数据,就是你登入后可以取得的预设的 shell 啦!那你也会看到,root 是 /bin/bash ,不过,系统账号 bin 与 daemon 等等,就使用那个怪怪的 /sbin/nologin 啰,在后文中会提供更多的说明

BASH 的全称是“Bourne Again Shell”,它是由 FSF 的 Brian Fox 开发。BASH 是 Bourne shell 的后继兼容版本与开放源代码版本。Bourne shell 是 Unix 第七版上使用的 Shell。以简洁、紧凑、高校著称、由 AT&T编写。Bourne Again 的双关语是 born again,新生的意思。黑客的幽默。

1.4 Bash shell 的功能

既然 /bin/bash 是 Linux 预设的 shell ,那么总是得了解一下这个玩意儿吧!bash 是 GNU 计划中重要的工具软件之一,目前也是 Linux distributions 的标准 shell 。 bash 主要兼容于 sh ,并且依据一些使用者需求而加强的 shell 版本。不论你使用的是那个 distribution ,你都难逃需要学习 bash 的宿命啦!那么这个 shell 有什么好处,干嘛 Linux 要使用他作为预设的 shell 呢? bash 主要的优点有底下几个:

  • 命令编修能力 (history)
  • 命令与文件补全功能: ([tab] 按键的好处)
  • 命令别名设定功能: (alias)
  • 工作控制、前景背景控制: (job control, foreground, background)
  • 程序化脚本: (shell scripts)
  • 通配符: (Wildcard)

通配符简介:除了完整的字符串之外, bash 还支持许多的通配符来帮助用户查询与指令下达。 举例来说,想要知道 /usr/bin 底下有多少以 X 为开头的文件吗?使用:『 ls -l /usr/bin/X* 』就能够知道啰~此外,还有其他可供利用的通配符, 这些都能够加快使用者的操作呢!

1.5 查询指令是否为 Bash shell 的内建命令: type

到关于 Linux 的联机帮助文件部分,也就是 man page 的内容,那么 bash 有没有什么说明文件啊?开玩笑~ 这么棒的东西怎么可能没有说明文件!请你在 shell 的环境下,直接输入man bash 瞧一瞧, 嘿嘿!不是盖的吧!让你看个几天几夜也无法看完的 bash 说明文件,可是很详尽的数据啊! _

不过,在这个 bash 的 man page 当中,不知道你是否有察觉到,咦! 怎么这个说明文件里面有其他的文件说明啊?举例来说,那个 cd 指令的说明就在这个 man page 内? 然后我直接输入 man cd 时,怎么出现的画面中,最上方竟然出现一堆指令的介绍?这是怎么回事? 为了方便 shell 的操作,其实 bash 已经『内建』了很多指令了,例如上面提到的 cd , 还有例如 umask 等等的指令,都是内建在 bash 当中的呢!

那我怎么知道这个指令是来自于外部指令(指的是其他非 bash 所提供的指令) 或是内建在 bash 当中的呢? 嘿嘿!利用 type 这个指令来观察即可!举例来说:

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


[root@node-135 /]# type -a java
java is /usr/bin/java
java is /opt/jdk-11.0.19/bin/java
[root@node-135 /]# type -t java
file
[root@node-135 /]# type -t cd
builtin
[root@node-135 /]# type -p java
/usr/bin/java
[root@node-135 /]# type java
java is /usr/bin/java
[root@node-135 /]# type ls
ls is aliased to `ls --color=auto'
[root@node-135 /]# type cd
cd is a shell builtin

透过 type 这个指令我们可以知道每个指令是否为 bash 的内建指令。 此外,由于利用 type 搜寻后面的名称时,如果后面接的名称并不能以执行档的状态被找到, 那么该名称是不会被显示出来的。也就是说, type 主要在找出『执行档』而不是一般文件档名喔! 呵呵!所以,这个 type 也可以用来作为类似 which 指令的用途啦!找指令用的!

1.6 指令的下达与快速编辑按钮

如果指令串太长的话,如何使用两行来输出?

[dmtsai@study ~]$ cp /var/spool/mail/root /etc/crontab \
> /etc/fstab /root

上面这个指令用途是将三个文件复制到 /root 这个目录下而已。不过,因为指令太长, 于是鸟哥就利用『 \[Enter] 』来将 [Enter] 这个按键『跳脱!』开来,让 [Enter] 按键不再具有『开始执行』的功能!好让指令可以继续在下一行输入。需要特别留意, [Enter] 按键是紧接着反斜杠 () 的,两者中间没有其他字符。因为 \ 仅跳脱『紧接着的下一个字符』而已!所以,万一我写成:『 \ [Enter] 』,亦即 [Enter] 与反斜杠中间有一个空格时,则 \ 跳脱的是『空格键』而不是 [Enter] 按键!这个地方请再仔细的看一遍!很重要!

如果顺利跳脱 [Enter] 后,下一行最前面就会主动出现 > 的符号, 你可以继续输入指令啰!也就是说,那个>是系统自动出现的,你不需要输入。

当你所需要下达的指令特别长,或者是你输入了一串错误的指令时,你想要快速的将这串指令整个删除掉,一般来说,我们都是按下删除键的。 有没有其他的快速组合键可以协助呢?是有的!常见的有底下这些:

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

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

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

相关文章

vue3搭建Arco design UI框架

技术:Vue3.2.40 UI框架:Arco design 2.44.7 需要安装:yarn 1.22.19 和npm 8.19.4 1.第一步安装本地全局arco脚手架 管理员运行CMD npm i -g arco-cli安装成功后如下: 2.第二步在需要存放项目的文件夹拉取项目 我这里把项目存放在 D:\W…

CTF:信息泄露.(CTFHub靶场环境)

CTF:信息泄露.(CTFHub靶场环境) “ 信息泄露 ” 是指网站无意间向用户泄露敏感信息,泄露了有关于其他用户的数据,例如:另一个用户名的财务信息,敏感的商业 或 商业数据 ,还有一些有…

【枚举+结论】icpc2022 济南 A

Problem - A - Codeforces 题意: 思路: 本来的思路是这样的 考虑最后会变成什么数,手摸了几个发现,都是2,不论本来的集合是不是包含2 然后就是猜测是不是直接变成2就好了 然后要去掉m个,直接考虑去掉最…

高速过孔同进同出?到底是什么一种设计体验

高速先生成员--黄刚 每当来一个比较新的概念时,高速先生总是非常的喜欢,随之而来的求知欲也会爆发个小宇宙。其实问题的来源是我们公司的北京分部的资深设计工程师,北京分部本身也是我司全国20多个分部里设计能力最强的分部之一了&#xff0c…

类的封装和包(JAVA)

封装 所有的OOP语言都会有三个特征: 封装;继承;多态。 本篇文章会为大家带来有关封装的知识。 在我们日常生活中可以看到电视就只有那么几个按键(开关,菜单……)和一些接口,而而我们通过这些东…

Day08-作业(MySQLMybatis入门)

作业1:多表查询 数据准备: 重新创建一个数据库 db03_homework 执行如下脚本,创建表结构,导入测试数据 -- 部门管理 create table tb_dept(id int unsigned primary key auto_increment comment 主键ID,name varchar(10) not n…

想了解好用的翻译pdf的软件吗?

在全球化的时代背景下,跨国贸易越来越普遍,跨语言沟通也越来越频繁。小黄是一家跨国公司的员工,他梦想能在全球各地拓展自己的业务,奈何遇到了一个巨大的挑战:跨语言沟通。在这其中,pdf文件是他经常接收到的…

CNN-NER论文详解

论文:https://arxiv.org/abs/2208.04534 代码:https://github.com/yhcc/CNN_Nested_NER/tree/master 文章目录 有关工作前期介绍CNN-NER模型介绍 代码讲解主类多头biaffineCNNLoss解码数据传入格式 参考资料 有关工作 前期介绍 过去一共主要有四类方式…

基于canvas画布的实用类Fabric.js的使用

目录 前言 一、Fabric.js简介 二、开始 1、引入Fabric.js 2、在main.js中使用 3、初始化画布 三、方法 四、事件 1、常用事件 2、事件绑定 3、事件解绑 五、canvas常用属性 六、对象属性 1、基本属性 2、扩展属性 七、图层层级操作 八、复制和粘贴 1、复制 2…

高并发架构去重难?架构必备技能 - 布隆过滤器

系列文章目录 当Dubbo遇到高并发:探究流量控制解决方案 主从选举机制,架构高可用性的不二选择 高并发架构去重难?架构必备技能 - 布隆过滤器 系列文章目录前言一、布隆过滤器简介二、特性与应用场景三、参数定制四、java版本的Demo五、总结 …

安全学习DAY13_WEB应用源码获取

信息打点-WEB应用-源码获取 文章目录 信息打点-WEB应用-源码获取小节概述-思维导图资产架构-源码获取(后端)后端-开源后端-闭源-源码泄露源码泄露原因源码泄露方式集合网站备份压缩包git,svn源码泄露DS_Store文件泄露composer.json 泄露资源搜…

网络安全 Day24-select高级用法和多表连接

select高级用法和多表连接 1. select 多子句单表高级实践1.1 select 多子句高级语法1.2 聚合函数1.3 group by 实践1.4 having 筛选1.5 order by 排序1.6 limit 2. 多表连接 1. select 多子句单表高级实践 1.1 select 多子句高级语法 where 和 having 区别是后者是分组后进行…

计算机视觉实验:人脸识别系统设计

实验内容 设计计算机视觉目标识别系统,与实际应用有关(建议:最终展示形式为带界面可运行的系统),以下内容选择其中一个做。 1. 人脸识别系统设计 (1) 人脸识别系统设计(必做):根据…

【iOS】Cydia Impactor 错误:file http.hpp; line:37; what: _assert(code == 200)

Cydia Impactor 报错,信息如下 file http.hpp; line:37; what: _assert(code 200)解决方案:Cydia Impactor 已被弃用,切换到sideloadly 即可,亲测成功,并且支持双重验证登录 csdn备份地址 HERE

kotlin 编写一个简单的天气预报app(四)增加界面显示

编写界面来显示返回的数据 用户友好性&#xff1a;通过界面设计和用户体验优化&#xff0c;可以使天气信息更易读、易理解和易操作。有效的界面设计可以提高用户满意度并提供更好的交互体验。 增加城市名字的TextView <TextViewandroid:id"id/textViewCityName"…

华为OD机试 Java 实现【批量处理任务】【2023 B卷 200分】,二分查找

目录 专栏导读一、题目描述二、输入描述三、输出描述四、二分查找五、解题思路六、Java算法源码七、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;…

SPSS常见图表一览

SPSS是一个统计分析软件&#xff0c;而不是可视化分析工具&#xff0c;它输出的图表主要便于我们更好的理解输出结果&#xff0c;了解数据的基本分布形态。 因此&#xff0c;SPSS中的图表并不复杂&#xff0c;但不能说不重要&#xff0c;我们不需要花费太多时间深究&#xff0…

Postgresql源码(109)并行框架实例与分析

1 PostgreSQL并行参数 系统参数 系统总worker限制&#xff1a;max_worker_processes 默认8 系统总并发限制&#xff1a;max_parallel_workers 默认8 单Query限制&#xff1a;max_parallel_workers_per_gather 默认2 表参数限制&#xff1a;parallel_workers alter table tbl …

什么是 DNS ANAME 解析?

本人使用谷歌搜索了简中互联网&#xff0c;完全没有找到任何有关 ANAME 的文章……本文该不会是头一份吧 相信大家对于 DNS 的解析方式都不陌生&#xff0c;常见的有 A、CNAME、MX、TXT 记录等等。其中&#xff0c;网站常用的是 A 记录和 CNAME 记录&#xff1a;A 记录用于将域…

SQL Developer中的Active Data Guard

这篇文章 Display Data Guard configuration in SQL Developer 中&#xff0c;用SQL Developer展示了多种ADG的拓扑。 今天自己也试了一下&#xff0c;还蛮简单的&#xff0c;其实最麻烦的部分在于搭建一个ADG环境。 假设我已有一个ADG环境&#xff0c;即最典型的环境&#x…