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()获取子进程的退出状态并释放资源

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

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

相关文章

js获取uniapp获取webview内容高度

js获取uniapp获取webview内容高度 在uni-app中&#xff0c;如果你想要获取webview的内容高度&#xff0c;可以使用uni-app提供的bindload事件来监听webview的加载&#xff0c;然后通过调用webview的invokeMethod方法来获取内容的高度。 以下是一个示例代码&#xff1a; <te…

Windows系统升级Nodejs版本

什么是nodejs Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境, 它让开发人员能够创建服务器 Web 应用、命令行工具和脚本。 NodeJs官网 网址&#xff1a;Node.js — 在任何地方运行 JavaScript 可以通过网址下载安装&#xff0c;通过官网可以看到现在最新版本为22…

Relay算子注册(在pytorch.py端调用)

1. Relay算子注册 (C层) (a) 算子属性注册 路径: src/relay/op/nn/nn.cc RELAY_REGISTER_OP("hardswish").set_num_inputs(1).add_argument("data", "Tensor", "Input tensor.").set_support_level(3).add_type_rel("Identity…

【JavaEE】网络原理之初识(1.0)

目录 ​编辑 局域网与广域网 IP地址和端口号 实现简单的服务器客户端交互 简单理解socket TCP和UDP的差别&#xff08;初识&#xff09; socket面对udp DatagramSocket API DatagramSocket 构造方法 DatagramSocket 方法&#xff1a; DatagramPacket API Data…

Redis数据结构ZipList,QuickList,SkipList

目录 1.ZipList 1.2.解析Entry&#xff1a; 1.3Encoding编码 1.4.ZipList连锁更新问题 2.QuickList SkipList跳表 RedisObject 五种数据类型 1.ZipList redis中的ZipList是一种紧凑的内存储存结构&#xff0c;主要可以节省内存空间储存小规模数据。是一种特殊的双端链表…

laravel 12 监听syslog消息,并将消息格式化后存入mongodb

在Laravel 12中实现监听Syslog消息并格式化存储到MongoDB&#xff0c;需结合日志通道配置、Syslog解析和MongoDB存储操作。以下是具体实现方案&#xff1a; 一、环境配置 安装MongoDB扩展包 执行以下命令安装必要的依赖&#xff1a; composer require jenssegers/mongodb ^4.0确…

【STM32项目实战】一文了解单片机的SPI驱动外设功能

前言&#xff1a;在前面我有文章介绍了关于单片机的SPI外设CUBEMX配置&#xff0c;但是要想使用好SPI这个外设我们还必须对其原理性的时序有一个详细的了解&#xff0c;所以这篇文章就补充一下SPI比较偏向底层的时序性的逻辑。 1&#xff0c;SPI简介 SPI是MCU最常见的对外通信…

【挖洞利器】GobyAwvs解放双手

【渗透测试工具】解放双手&Goby配合Awvs渗透测试利器\x0a通过Goby和Awvs 解放双手https://mp.weixin.qq.com/s/SquRK8C5cRpWmfGbIOqxoQ

LangChain4j(15)——RAG高级之跳过检索

之前的文章中&#xff0c;我们介绍了RAG的使用&#xff0c;但是&#xff0c;每次提问时&#xff0c;都会通过RAG进行检索。有时&#xff0c;检索是不必要执行的&#xff0c;比如&#xff0c;当用户只是说“你好”时。于是&#xff0c;我们需要有条件的跳过检索过程。 跳过决策…

【SDRS】面向多模态情感分析的情感感知解纠缠表征转移

abstract 多模态情感分析(MSA)旨在利用多模态的互补信息对用户生成的视频进行情感理解。现有的方法主要集中在设计复杂的特征融合策略来整合单独提取的多模态表示,忽略了与情感无关的信息的干扰。在本文中,我们提出将单模表征分解为情感特定特征和情感独立特征,并将前者融…

Sui 上线两周年,掀起增长「海啸」

两年前的 5 月 3 日&#xff0c;Sui 的主网正式发布&#xff0c;将在开发网和测试网上验证过的下一代技术承诺变为现实。这一新兴网络旨在优化现有区块链技术&#xff0c;结合高性能计算环境与安全性、可验证性及韧性。 随着 Sui 迎来两周年&#xff0c;这股浪潮已成长为「海啸…

深入理解 mapper-locations

mybatis-plus.mapper-locations: classpath*:/mapper/**/*.xml 是 MyBatis/MyBatis-Plus 在 Spring Boot 配置文件&#xff08;如 application.yml 或 application.properties&#xff09;中的一项关键配置&#xff0c;用于指定 MyBatis Mapper XML 文件的存放路径。以下是详细…

电容的作用

使用多个电容是从电容的实际等效模型去考虑的(也就是从SI&#xff0c;信号完整性方面&#xff09;。只考虑一个实际电容时&#xff0c;它的阻抗曲线是一个类似于倒三角形的形状&#xff0c;只在谐振频率点(与等效串联电感形成)处的阻抗最小。因此相当于只在这一个频率点处及附近…

移植的本质是什么

有断时间我就在想&#xff0c;为什么freertos&#xff0c;lvgl等等的移植都是把库文件放进来&#xff0c;直接点击编译&#xff0c;然后把bug都处理完成就移植成功了&#xff0c;为什么呢&#xff1f; 明明我一个函数都没调用&#xff0c;为什么会有一堆错误&#xff0c;莫名其…

广告场景下的检索平台技术

检索方向概述 数据检索领域技术选型大体分为SQL事务数据库、NoSQL数据库、分析型数据库三个类型。 SQL数据库的设计思路是采用关系模型组织数据&#xff0c;注重读写操作的一致性&#xff0c;注重数据的绝对安全。为了实现这一思路&#xff0c;SQL数据库往往会牺牲部分性能&…

高频PCB设计如何选择PCB层数?

以四层板为例&#xff0c;可以第一层和第二层画信号&#xff0c;作为信号层。 第三层可以走电源&#xff0c;然后第四层走GND 但是更可以第一层和第三层画信号。第二层可以走电源&#xff0c;然后第四层走GND 用中间的电源层以及地层可以起到屏蔽的作用&#xff0c;有效降低寄…

[Linux_69] 数据链路层 | Mac帧格式 | 局域网转发 | MTU MSS

目录 0.引入 1.以太网帧格式 2.重谈局域网转发的原理(基于协议) 小结 3.认识MTU 3.1MTU对IP协议的影响 3.2MTU对UDP协议的影响 3.3MTU对于TCP协议的影响 0.引入 在去年的这篇文章中&#xff0c;我们有对网络进行过一个概述[Linux#47][网络] 网络协议 | TCP/IP模型 | 以…

vue2 provide 后 inject 数据不是响应式的,不实时更新

今天用 provide 后&#xff0c;inject 获取数据时不是实时更新的&#xff0c;获取的不是更新后的值 祖父组件 <div style"text-align: left !important;"><button click"change">更改</button> </div>data() {return {name: ini…

洛谷---P1629 邮递员送信

题目描述 有一个邮递员要送东西&#xff0c;邮局在节点 1。他总共要送 n−1 样东西&#xff0c;其目的地分别是节点 2 到节点 n。由于这个城市的交通比较繁忙&#xff0c;因此所有的道路都是单行的&#xff0c;共有 m 条道路。这个邮递员每次只能带一样东西&#xff0c;并且运…

2025年LangChain(V0.3)开发与综合案例

LangChain是什么&#xff1f; 在实际企业开发中&#xff0c;大模型应用往往比简单的问答要复杂得多。如果只是简单地向大模型提问并获取回答&#xff0c;那么大模型的许多强大功能都没有被充分利用。 要开始使用LangChain&#xff0c;首先需要安装相关的库&#xff1a; pip …