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