10 - shell详解

蒸汽
蒸汽
发布于 2024-12-16 / 9 阅读
0
0

10 - shell详解

🍐1 硬件、核心与shell:

🍌概念

主管kernel的控制工作,通过shell将我们输入的指令与kernel沟通,好让kernel可以控制硬件来工作

shell提供了使用者使用os的一个接口,其本质是调用其他的应用程序(man, chmod 等等)来调用kernel实现功能

h/w | Kernel | user 关系如下: image.png

🍎种类:

  • Bourne Shell(Sh)

  • C Shell (sun使用)

  • KSHell

  • TCsh

  • Bourne SHell(bash)是sh的增强版本,linux使用的常见版本

ps:第一个流行的shell是Steven bourne发明的,为了纪念他bash才叫bourne shell哦!

默认登录使用的shell在/etc/passwd中记录! image.png

🍉功能:

  • 命令编修能力(history) 指令记录保存在主文件夹的==.bash_history==中,为上一次登录的指令记录,本次的会先存在内存中,退出了才写入history!

  • 命令与文件补全(tab)

  • 设置别名(alias)

可直接在命令行设置:
例如: alias lm = 'ls -al'
  • 工作控制,前景背景控制?

  • 脚本(scripts)

  • 万用字符(Wildcard)

🫒查看指令是否为bash内置指令

type命令: image.png

🥭2. shell变量功能

🫛变量:

以一组文字或者符号,来取代一些设置或者是保留一串数据 可变性与方便性 脚本设计的好帮手(更换时只需要修改少量代码) image.png

🥐变量取用,设置,取消

echo + $: 取得变量内容

规则:

  • 等号

  • 不能直接接空格(可用 \, "", ''解决)

  • 嵌套指令(``或者 $)

  • 扩增变量内容($)

  • 其他子程序执行该变量(export设置成环境变量)

  • unset取消变量

🥒环境变量

PATH定义:os ➡ PATH ➡ 去PATH路径中搜索

env:列出目前shell环境下所有的环境变量与其内容

set:观察所有变量(环境变量 + 自定变量) image.png image.png

  • PS:命令提示符,每次按下enter后自动会读取的变量值,PS有很多自带的符号意义,比如"[\u@\h\W]$" ➡ "[qhr@ubuntu ~]$"

  • $:关于本shell 的pid

  • ?:上个执行指令的回传值

  • OSTYPE HOSTTYPE MACHTYPE :主机硬件与核心等级

export

环境变量与自订变量区别:在于是否会被==子程序==继承! 父子程序示例: image.png

export的作用:让自定变量能继续在子程序中使用

ps:declare可以让环境变量转化为自订变量

image.png

🍋‍🟩语系变量

Linux支持的语系查询: locale -a image.png ps:仅设置LANG和LC_ALL的话,其他的语系变量也会被这两个的取代

系统修改语系: /etc/locale.conf

暂时修改:修改LANG和LC_ALL变量(LC_ALL要用export)

🍇变量的有效范围

前面说过通过export可将自订变量转换成环境变量

原理:

  • 启动shell,os会给shell分配内存,shell将其环境变量写入内存

  • export让自订变量也写入shell的内存,这样相当于变成了”环境变量“!

  • 子程序调用时,会将shell的内存信息写入自己的内存块中,实现父子的继承

🐝变量键盘读取、阵列与宣告:read, array, declare

read

image.png

declare/typeset:

作用:宣告变量的类型 image.png image.png image.png

var[index] = content阵列变量

image.png image.png

🧅与文件系统及程序的限制关系: ulimit

ulimit作用:限制使用者的某些系统资源,包括可以打开的文件数量,可以使用的cpu时间,内存总量等等

image.png

复原方式:登出再登录,否则就需要重新设置ulimit

3 🧄变量内容的删除、取代、替换(optional)

作用:变量内容的==微调== image.png

1. 删除

#:从变量内容的最前面开始向右删除,且仅删除最短的 ##:从变量内容最前面开始向右删除,且仅删除最长的

示例: image.png image.png

image.png

\%:从后面往前删除,最短 \%\%:从后面往前删除,最长

image.png

2.取代

下划线/:第一个旧字串会被新子串取代 双下划线//:全部旧子串会被新子串取代

image.png

3.测试替换

image.png

横杠-:若变量存在则返回值,不存在则创建,以-后的内容作为变量的值

image.png

ps:避免空子串赋值,可以在大括号里加上冒号”:“来避免 image.png

🥥 命令别名与历史命令

alias: 设置别名 alias xx = 'xxx '

unalias: 取消设置

historyimage.png

ps:history不仅可以查询,还可以帮我们简化执行命令(无法记录时间但是) image.png

🧄4 Bash shell 的操作环境

4.1 路径与指令搜索顺序

绝对相对路径 ➡ alias查找 ➡ bash内置(builtin)指令 ➡ $PATH

type -a 命令image.png

4.2 bash的进站与欢迎信息

  • /etc/issue:==展示登录欢迎信息== 内部含有的代码(与PS1变量功能类似) image.png

image.png

  • /etc/mtod: 可写入信息在登录时展示

4.3 bash的环境配置文件

4.3.1 login shell与 non-login shell

  • login shell:取得bash需要完整的登录流程

  • non-login shell:取得bash不需要重复登录的举动

配置文件:

  • /etc/profile:系统整体设置,最好不修改 ➡ login-shell才有

  1. 包含一些变量,比如PATH, MAIL,USER, HOSTNAME,HISTSIZE, umask

  2. /etc/profile还会读取

    • /etc/profile.d/ *.sh(包含多个sh后缀文件) ➡ 调用/etc/loace.conf(从/etc/profile.d/lang.sh调用)

    • /etc/profile.d/bash_complemention.sh ➡ 调用/usr/share/bash-complemention/completions/ *

下三种属于使用者个人配置, 也是login-shell才会读取,只读下面三个文件的其中一个,若不存在就按顺序度下一个。

  • ~/.bash_profile:

  • ~/.bash_login

  • ~/.profile

综上,整个bash的配置文件读取流程可以这么描述: image.png

实线为主线流程,虚线的方向为被调用的配置文件。

4.3.2 source

作用:读入环境配置文件的指令

区别于/etc/profile:不需要login-shell登出后再登入才能使用,而是直接启动则加载

示例: image.png

  • ~/.bashrc: non-login shell下只会读取该配置文件

  • 其他相关配置文件

  • /etc/man_db.conf : 规定了下达man的时候,去哪里查看素具的路径设置(偶尔需要把某个命令的man文件手动添加在mandb.conf中)

  • ~/.bash_history:获取命令执行记录

  • ~/.bash_logout: 记录了登出bash时,系统需要做的一系列离开前的操作(默认只是清空屏幕讯息)

4.4 终端机的环境设置: stty, set

  • stty(setting tty):

查询目前一些按键内容(-a),设置组合hotkey对应的功能(stty 【功能】 【hotkey】)

image.png

  • set:除了设置一些变量之外,还可以设置指令输入/输出环境

4.5 万用字符和特殊字符

万用字符: image.png

特殊字符: image.png

🍖5. 数据流重导向

image.png

5.1 重定向类型

  • std output 指的是指令执行所回传的正确的讯息

  • std error output 指的是指令执行失败后,所回传的错误讯息

  • std in 指的是将原本需要由键盘输入的数据,改由文件内容来取代

5.1.2 重定向传送的特殊字符形式

image.png

5.1.3重定向的方法(覆盖 or 累加?)

image.png

分别存入不同文件(正确 or 错误) image.png

5.1.4 /dev/null 垃圾桶黑洞设备与特殊写法

  • 错误信息导入黑洞 image.png

  • 正确和错误信息写入同一个文件 image.png

5.2 命令执行的判断依据: ;,&&,||

如何做到一次性执行很多指令?

  1. shell script(后续学习)

  2. 一次输入多重命令

5.2.1 cmd ;cmd

在指令与指令中间利用分号(;)隔开,这样会连续执行多条命令

5.2.2 $?(指令回传值)与 && 或 ||

运用场景:两个指令之间存在相依性,主要是判断前一个指令是否执行正确

ps:==若前一个指令执行的结果为正确,在Linux下会回传一个 $? = 0 的值 image.png

🥗6. 管线命令(pipe)

符号: |

作用: 仅能处理经由前面一个指令传来的正确信息,也就是standard output的信息,对于standard error 并没有直接处理的能力

示意图如下: image.png

ps: 管线命令必须要接受来自前一个指令的数据,否则无效

6.1 撷取命令: cut,grep

cut:==以行为单位==将一段讯息”切“出来

示例: image.png image.png

grep:在一段讯息中,按行分析,==取出所需要信息的行==

示例:

image.png

6.2 排序命令

sort: 排序命令 image.png

uniq:使重复的数据仅列出一个显示 image.png

wc:word count 统计行数,字数,字符数

image.png

6.3 双向重导向: tee

tee:同时将数据流分送到文件和屏幕

image.png

6.4 字符转换命令

tr:删除或者替换 image.png

col:可以简单处理tab为对等的空白键

image.png image.png

join: 两个文件当中,有”相同数据“的那一行,才将他加在一起 在处理多个有相关性的文件的时候,很方便将有相关性的数据结合在一起查看

image.png ps:使用join之前要先用sort进行排序,否则可能有些比对的项目会被略过!

expand: 将tab转换成空白键 image.png

6.5 分区命令

split: 大文件分区(按大小,按行)

image.png

xargs: xargs可以读取stdin的数据,并且以空白字符或者断行字符作为分辨,将stdin的数据分割为arguments image.png ps:很多数据并不支持管线命令,用xargs可以引用stdin的数据来处理!!

6.7 减号-的用途

在管线命令中,若某些指令需要用到文件名称(但在管线中可能是stdin或者stdout)时,可以用”-“来代替stdin,stdout image.png


评论