当前位置: 首页 > news >正文

linux -shell原理与运用

1---shell的工作方式和功能

shell的工作方式:

shell本身也是一个应用程序,存储在/bin 或者是/user/bin中

登录的时候 会根据/etc/passwd文件载入shell默认执行

shell启动后,就会显示命令提示符,等待用户输入命令

命令的逻辑:

首先会判断时内部命令还是外部命令,如果是内部命令就会由shell直接去执行,如果时外部命令就会创建子进程,然后调用磁盘上的程序执行

shell的功能:

环境控制:允许用户定制环境来满足对应的需要

后台处理:再前台处理事务的同时,后台执行程序

脚本执行环境:编程完成复杂任务再shell中执行程序

命令执行:解释所有输入的字符,分析命令,处理通配符并重定向符号

文件名替换:先进行文件名替换后,在执行程序

输入输出重定向:shell完成输入输出的重定向

管道:符号|:将程序连接起来一起完成复杂的任务

echo信息输出

常用的选项:

-n 禁止换行

-e 解释\ 引导的转义序列,转义序列需要””包裹

常见的转义序列:

\a:警铃

\b:回退

\n:回车

\r:回车,但是不换行

\c:禁止换行

\t:水平制表符

\v:垂直制表符

如果需要按照原样输出,就需要使用””包裹内容

元字符:

在shell中有特殊含义

? * [] < > | $ & `

\ “ ‘:这三个可以用来消除特殊含义,当然这3个也是元字符

2---:shell的变量

环境变量:用于配置和定义系统或用户环境的变量

         在shell启动的时候被船舰并赋予初始值  ,后续用户也可以定义新的环境变量or修改环境变量

局部变量:用户根据需求自己创建并且复制的变量,可以定义,修改,删除他们

set:

查看当前环境的shell变量

赋值方法:变量名=变量值

通常局部变量用小写,环境变量用大写字母

(默认类型时字符串)

修改和赋值一样

访问:

$ 变量名

可以使用””包裹来实现变量和常量一起打印

删除变量:

unset 变量名

变量的使用

$all=-ali

$ls $all 就是ls -ali

重要的环境变量:

作用:影响shell的行为和用户的工作环境

赋值:启动的时候根据配置文件赋值

值的修改:

一个是临时修改,作用于当前的会话

一个是永久的修改,在全局or个人的配置文件中去修改

重要的一些环境变量

在PATH中加入

$PATH=$PATH:/usr/mybin

如果修改了$HOME 就会导致pwd的路径发生变化

PS1=’提示符’

PS1的常见转义序列:

PS2:区别其他行和第一行的区别:

默认>

SHELL:shell的完整路径

PWD:当前工作目录的绝对路径

3--:输入输出重定向:


一般从标准输入设备获得输入,

将输出的信息输出到标准输出设备上

将错误信息输出到标准出错设备上

shell可以将这里的所有信息,重定向到指定的位置

1:输入重定向

命令:<  和  <<

命令 < 文件

前提条件:命令需要输入数据,并且能够从标准输入设备读入数据

比如(**可以,而**则不可以)

将文件作为输入,执行命令

cat < xxxx

cat xxxxx

虽然他们的展示内容一样,但是他们的原理不一样

cat < test.txt:是把文件内容重定向给 cat 命令的标准输入。

cat test.txt:是让 cat 命令直接读取文件

命令 << 分界符

输入内容

分界符

将两个分界符中间的内容作为输入

2:输出重定向

命令:>  和  >>

命令格式 : 命令 > />> 文件

他们的区别:第一个是覆盖重定向,第二个是追加重定向

如果文件不存在,他们都会创建一个文件,然后将内容输出

3:标准错误重定向

2>

命令格式: 命令 2>  文件

4:重定向的组合使用

命令格式: 命令 < 输入文件 > 输出文件

         把输入文件作为输入,然后把结果放到输出文件

          命令 < 输入文件 > 输出文件 2> 错误信息文件

         同上,只是把错误信息保存到错误信息文件

比如cat命令

第一个abc是用户输入,第二个abc是cat回显

--1:把filea的内容给cat,然后把cat内容输出到fileb

--2:把filea,fileb,filec的内容给cat,然后把cat内容输出到fileall

--3:向文件filea中追加内容(需要ctrl + D 结束)

--4:把下一次END之前的所有内容输出到filea

5:连接输入输出

元字符 | : 把一个命令的输出传递给下一个作为输入

命令格式: 命令1|命令2

管道:命令行中实现进程间通信的机制

1,创建管道,创建一个缓冲区,用于存储第一个命令的输出

2,命令的执行,命令1执行后将其的输出写入管道

3,数据的传递,命令2接受管道的数据作为输入

4,关闭管道,命令1执行完后,关闭管道的写入端,命令2读取完毕后关闭读取端

命令流水线:

多个命令组合,

--:统计当前ls目录的文件个数

--:``引起来的先执行,将当前用户的数量作为输入,把echo的内容输出到loginUsers中

--:查看21-50行

-6:复制输出

tee

命令格式: tee [选项] [文件名]

-a: 表示使用append,将数据追加到指定文件,而不是覆盖

--:把ls结果同时输出(覆盖)到文件Isoutput 和 屏幕上

--:把ps结果同时输出(覆盖)到文件ps1 ,ps2 和 屏幕上

--:把echo结果同时输出(追加)到文件status 和 屏幕上

4--:SHELL的其他的元字符:

` :用于命令执行的元字符

先执行被`包裹的命令,然后替换到原来的命令中

echo - e (启动反斜杠转义)结合 \ 表示没有完成输入

第二行的第一个>是提示符,等待继续输入,第二个>是输出重定向,把echo的内容输出到文件LIST

; :在一个命令行中分割多个命令,shell从左向右执行

命令格式:命令1;命令2;.....

将ls输出到filelist,把date输出到datetime,最后显示当前的路径

() : 命令编组,把几个命令编组执行

可以把一组命令的结果进行重定向

&:后台运行

对应的前台执行会封锁键盘,但是后台就不会

--:把data在后台排序,然后重定向到sorted

输出的是作业号和进程标识符

--:多个命令在后天执行,输出的是作业号和进程标识符

从左到右分配作业号吗?

我们可以通过fg %作业号,把后台作业拉到前台

我们也可以通过kill,对进程进行操作

5--:进程相关的命令

sleep:

执行该命令的进程延迟执行

命令格式 sleep 数字 [s/m/h/d]

ps:

显示进程的详细信息

命令格式 ps [选项]

PID:进程ID

TTY:控制进程的终端号

TIME:进程已经运行的时间(s)

CMD:命令名

选项:

-e : 显示系统的所有进程信息

-f : 显示信息的完整列表 (包括完整的命令行)

kill:

终止进程,发送信号给指定的进程,进行进程间的通信

命令格式: kill [- signal] PID

这里的signal可以通过 kill -l 来查看

比如:

终止信号:

-SIGTERM 和 -15等效 温和的正常方式关闭进程 ,也是kill的默认方式

-9 强制关闭进程

用户只能终止自己的进程,管理员才能终止任何用户的进程

6--:SHELL的配置文件:

启动和使用过程中需要通过执行配置文件来对用户的环境进行定制

这个配置文件中包含了各种命令和设置,用于定义环境变量,别名,函数等等

用户选用的shell的不同,配置文件也不同,下面是bash shell的配置

常用的配置文件

系统级别的配置文件

/etc/profile: 设置系统整体环境和自启动重新,登录的时候执行

/etc/bashrc: 设置系统整体函数与缩写,打开bash的时候执行

用户级别配置文件

~/.bash_profile 设置登录用户的bash环境 执行~/.bashrc

~/.bashrc      设置当前用户的bash环境

~/.bash_logout  设置用户退出bash时执行的配置

登录shell和非登录shell

登录shell会先/etc/profile 然后 ~/.bash_profile,~/.bashrc ,/etc/bashrc.

登出执行~/.bash_logout

非登录shell会执行~/.bashrc 然后 /etc/bashrc

export 内部命令,将局部变量提升为全局变量

语法格式:export 变量名=值

          export 变量名

局部变量只能在定义其的shell中使用,子shell不可见不可用

全局变量当前shell和子shell都可见可用

alias:内部命令,为常用命令定义一个别名

设置别名

alias 别名 = 命令 设置别名

查看别名

alias 显示定义了的别名

取消别名

unalias 别名

7--:linux进程管理:

进程的概念:

进程是程序在操作系统中的动态执行实例

它是一个程序在其执行过程中所占用的资源的集合

作用:

操作系统进行资源分配和调度的基本单位

管理方式:

在linux系统中,进程通过内核来创建和管理进程

进程的创建和管理:

创建:
fork() or exec()来创建

资源的分配:

内核为新进程分配内存和CPU时间片

task_struct 结构体:

相当于进程控制块(PCB),里面包含了PID,状态,资源指针,调度信息,安全上下文等等

管理方式:通过红黑树or链表组织,由系统统一管理

进程生命周期的内核的操作:
1:进程的创建:

分配task_struct;
内核为新的进程分配task_struct 并且初始化,复制and共享父进程的资源,确保进程的独立运行

加入进程调度队列:

将心的task_struct 插入到进程调度队列中

分配PID:
内核为新进程分配唯一的PID,采用位图or循环分配机制管理PID

2:进程调度

遍历可运行队列,调度器遍历可运行队列的task_struct

选择目标进程:根据调度策略选择合适的进程

切换CPU上下文:通过context_switch()来切换上下文

3:进程终止
设置退出状态:调用exit(),将状态设置为EXIT_ZOMBIE,但是资源还米有回收

释放资源:父进程调用wait()之后,释放task_struct和对应的资源

解析命令date:

fork()命令:

shell调用fork()生成了子进程,子进程继承父进程的上下文后,内核为其分配PID,并将task_struct加入到任务队列

exec()命令:
子进程调用execve(“/bin/date”)加载date程序,父进程调用wait()进入阻塞状态

运行和退出:

子进程调用date,输出日期和时间,当命令执行完毕后,子进程调用exit(),父进程通过wait()获取子进程的退出状态并释放资源

相关文章:

  • openwrt 使用quilt 打补丁(patch)
  • 【Harbor v2.13.0 详细安装步骤 安装证书启用 HTTPS】
  • WebRTC并非万能:RTMP与RTSP的工程级价值再认识
  • Flutter开发IOS蓝牙APP的大坑
  • 【2025】Visio 2024安装教程保姆级一键安装教程(附安装包)
  • 【奔跑吧!Linux 内核(第二版)】第1章:Linux 系统基础知识
  • Ros工作空间
  • IDEA 占用C盘太大清理
  • LangChain:大语言模型应用的“瑞士军刀”入门指南
  • 上市公司-企业上下游供应链数据(2003-2023年)-社科数据
  • 推导部分和-图论+dfs+连通块
  • 【数据挖掘】Apriori算法
  • 主数据 × 知识图谱:打造企业认知智能的核心基础设施
  • 全国青少年信息素养大赛 Python编程挑战赛初赛 内部集训模拟试卷一及详细答案解析
  • 孤岛铜怎么解决
  • 极狐GitLab 如何将项目共享给群组?
  • 极狐Gitlab 里程碑功能介绍
  • 手写 Vue 源码 === Effect 机制解析
  • Vue3.5 企业级管理系统实战(十七):角色管理
  • WordPress_AdsProPlugin Sql注入漏洞复现(CVE-2024-13322)
  • 保利发展前4个月销售额约876亿元,单月斥资128亿元获4个项目
  • 印方称若巴方决定升级局势,印方已做好反击准备
  • 多个“网约摩托车”平台上线,工人日报:安全与监管不能掉队
  • 人民日报和音:引领新时代中俄关系坚毅前行
  • 贵州黔西市游船倾覆事故致9人死亡1人失联
  • 保持高位运行,今天全国铁路预计发送旅客1800万人次