Linux课程复习笔记
声明:本篇文章参考和引用了2023下半年吉林大学郭东老师的PPT,如有侵权,请联系我,我将会立马删除
一、UNIX操作系统
1.历史简介
1969年诞生于AT&T贝尔试验室
开发者是Ken Thompson 和 Dennis Ritchie
最初使用汇编语言开发,后用C语言重写UNIX源码,UNIX和C完美地结合成一个统一的整体
UNIX以源代码的形式发行,形成了两个重要的流派:
UNIX SYSTEM V (AT&T)和 Berkeley UNIX(UCB)
2.标准化
即对每种实现必须定义的各种限制进行说明
有两个重要的UNXI标准:
- 系统V接口定义 SVID 例如: at&t
- 可移植操作系统接口 POSIX 例如:IEEE、 ISO
3.其他的UNIX系统
1> Linux
目前应用最为广泛的类UNIX系统
背景
「两个人」:
Richard Stallman和 Linus Torvalds,前者启动GNU项目 创建FSF组织 提出copyleft理念 制订GPL协议 发起开源运动
「四个一」:
- 一个项目 GNU
GNU’s NOT UNIX
目标:
创建一个自有共享 可以被任何人修改的类UNIX操作系统
与UNIX系统兼容
不受UNIX名字和源代码私有权限制
能运行UNIX程序
GNU项目完成了许多UNIX系统上应用程序的仿制品
GNU项目开发的重要软件工具有:
GCC:GNU编译器套件,包括GNU c编译器
G++:C++编译器 是GCC的一部分
GDB:源代码级的调试器,支持多种语言
GNU make: UNUX make命令的免费版本
bash: 命令解释器(shell)
GNU Emacs : 文本编辑器及环境
未成功开发操纵系统内核
-
一个组织 FSF
自由软件基金会
目标:
执行GNU计划 提供技术 法律以及财政支持
开发更多的自有软件
-
一个理念 Copyleft
-
一个许可证 GPL
背景:
发行大型软件需要的合适许可协议已经有的许可协议:
Copyright©:版权所有,即软件的一切权利归软件作者私有,用户只有使用权没有其他权利包括复制软件的权利
Richard Stallman提出Copyleft的概念(著左权)
利用现有的著作体制来保护所有用户和二次开发者的自由授权方式
它赋予所有人运行程序,复制程序,修改程序和发行修改程序的权限,但是使用者不能在修改后的软件上添加限制
基于copyleft Stallman提出来了GPL许可证,GNU通用的公共许可证
GPL授予程序接受人以下权利,或称“自由”:
- 赋予所有人运行程序,复制程序,修改程序和发行修改程序的自有
- 重新发行软件的人不能在修改后的软件上添加限制
GNU开发的工具都在GPL下发行
意义:
其他开源许可证:
Apache ,BSD,MIT,Mozilla
Linux的诞生
内核在GPL协议下发布,参与了开源运动,Linux内核更新速度极其快
吉祥物:tux
Linux的含义:操作系统内核或者是基于linux内核的操作系统
Linux操作系统版本:包括内核版本和发行版本
[内核版本]:有Linux内核社区统一进行发布,包括主版本号 次版本号和修订次数,奇数表示开发版本,偶数表示稳定版本,修订次数标明内核被修改的次数
「发行版本」 发行版的名称或版本号是由发行版的维护者决定
2> UNIX操作系统概要
计算机系统= 硬件+系统软件+应用软件
UNIX操作系统是包含了文本编辑器 编译器 和其他系统工具程序的程序集
UNIX操作系统是按照分层软件模型实现的
内核:
「相关概念」
虚拟计算机:UNIX向系统中每个用户指定一个执行环境,这个环境称为虚拟计算机,包括一个用户接口终端和共享的其他计算机资源,UNIX是多用户操作系统 虚拟计算机的集合,而从用户视角是独想计算机
进程:UNUX系统通过进程向用户分配资源
「特征」
可移植性(c语言保证)
多用户性:多用户同时共同使用计算机,各个用户执行不同的程序,提供安全机制隔离用户
多任务性:启动一个任务后继续执行其他任务,允许用户在前台和后台多个任务之间进行切换
分级文件系统:对数据和程序文件进行分组管理,便于查找文件和程序
与设备独立的输入输出操作:
用户界面shell:
命令解释器: 控制用户与系统的交互,实现用户命令输入与结果输出
shell脚本: UNIX Shell是一种成熟的编程语言,Shell 脚本 包含一系列命令, 实现较为复杂 的功能
系统工具与服务:UNIX系统包括100多个系统工具程序(命令),标准的UNIX系统组成部分完成用户所需要的各种功能
二、Linux入门
1.登录系统
「登录作用」
- UNIX是一个多用户操作系统。
- 用户在使用UNIX系统前必须进行登录
「登录方式」
- 本地登录:在本地输入用户名和密码登录
- 远程登录:使用远程登录软件登录 eg: ssh
「命令提示符」
最简单的命令提示符只有一个字符,一般root根用户是#,普通用户是$,用户可以设置提示符,显示丰富系统信息。
普通用户
「修改口令」
passwd命令来修改或创建口令
1.可以修改自己的口令:
2.修改别人的口令
1 | passwd username |
只有root可以
3.创建口令
1 | passwd username |
应用场景:root创建普通用户后,为其分配初始口令
「退出系统」
用户完成工作后离开系统的过程,退出意味着和系统断开连接结束对话
三种方法:
1 | exit |
logout需要在登录shell中
2.命令
- UNIX系统有几百条命令/系统工具
- 绝大多数命令格式相同
- 大部分UNIX提供在线帮助 help man info
- 通过输入命令告诉系统要做什么事
- 命令行中回车键解释为命令行的结束符
例子:
「命令格式」
基本格式
命令本身 和 命令+选项
1 | #命令+选项 |
不同流派
「日期和时间的显示」
1 | date |
UNIX使用24小时制
「用户信息」
who命令
1 | who |
第一列:登录用户名,登录用户名
第二列:登录终端号,登录到哪里
第三列:登录时间
第四列:登录主机,从哪里登录的
「终端」
物理终端:一套输入输出设备,用于用户登录和使用计算机,如连接在计算机上的显示器,鼠标,键盘与名词主机对应
虚拟终端(tty)
本地的linux系统提供的,例如虚拟机或者是linux系统服务器之类的,
使用虚拟机登录终端为tty
对于Ununtu图形化界面
伪终端(pty)
由远程登录软件或终端模拟软件模拟出的终端
「常用其他命令」
who am i和whoami命令
1 | who am i |
显示终端上登录的用户信息
1 | whoami |
显示用户名
显示日历 cal命令
默认显示当月日历
参数中可以指定年和月,显示指定年月的日历表
help命令 man命令 info命令
「内部命令」 shell代码中的一部分,shell启动后驻留内存,执行速度快
「外部命令」保存在文件系统中的程序,被调用时才载入内存执行
last命令
1 | last |
它用来展示关于系统用户最后登录会话的信息
输出的每一行从左到右包含的列分别是:
- 用户名。 当系统重启或者关闭时,
last
显示指定用户为reboot
或者shutdown
。- 会话占用的 tty。
:0
通常意味着用户登录了一个桌面环境- IP 地址或者用户登录的主机名
- 会话开始时间和停止时间
- 会话时长。如果会话仍然是激活的,或者用户没有登出,last 将会显示信息,而不是时长
history
显示输入的所有命令记录
1 | history |
「命令行快捷键与命令补齐」
3.shell
4.软件的安装与卸载
「安装软件」
1.两种方法
-
下载软件源代码后编译安装
-
基于网络存储库安装/更新软件
两种基于网络存储库的软件安装方法:
1.yum后继为dnf eg:Redhat OpenEluer
2.apt eg:Ubuntu Debian
2.使用yum(dnf)安装软件包
软件包集合:服务于一个共同的目的一组软件包,例如系统工具集等
使用dnf可以对软件包组进行安装和删除等操作,使相关操作更高效
5.登录过程
启动过程
操作系统常驻部分载入内存其余部分保留在磁盘上,用户请求时候再载入内存,用户登录时 shell程序载入内存。
[init进程]:UNIX系统所有进程的祖先进程,启动所有系统服务和后台进程,系统启动后init创建虚拟终端为用户登录做准备
三、vi编辑器
工具软件,文本编辑器,用于创建新文件或修改旧文本文件,编辑对象是文本文件,相对简化的字处理器
1.工作模式
「命令模式」
启动后默认进入,所有的输入都被看作命令,不显示,被执行,通过按键删除字 行 段落,移动光标或者执行其他操作
「末行模式」
按下冒号,在最后一行输入命令,回车结束命令
「文本输入模式」
键盘输入文本字符,屏幕显示用户输入
「模式切换」
注意大小写和英文字符
2.基本操作
「打开或创建文件」
1 | vi #在当前工作目录新建一个文件并打开 |
「编辑文件」
- 按下小写字母 i 进入文本输入模式
- 通过键盘进行输入文本
- 按下 BackSpace或者Ctrl+h删除字符
- 每行结束后按Enter进入下一行
「保存文件与退出」
按下ESC退出文本编辑模式进入命令模式,输入
1 | :wq |
上述三种的其中一种,按下回车即为保存并退出
1 | :q |
若文件没被修改即为退出,已经被修改未保存则无法退出
1 | :q! |
不保存文件直接退出
「存储缓冲区」
「光标的移动」
命令模式下
命令模式进入文本输入模式不同的命令键有不同的效果:
光标移动键(命令模式)
精准定位
命令模式:
末行模式:
翻页:
文件修改:
命令模式下:
删除字符:
1 | #删除单个字符 |
删除行和单词
1 | #删除光标所在行 |
重复上一次操作
1 | . |
替换字符
载入文本
从其他文件中载入文本内容
1 | :r 文件名 |
1 | :a,b w file |
文件重排:
1 | #复制当前行 |
使用操作符和域控制键修改/重排文本
3.定制vi
「选项格式」
1 | #只显示修改过的选项 |
例如:
1 | #显示行号 |
「vim配置文件」
1 | ~/.exrc |
vi编辑器中使用命令设置的所有选项都是临时的,退出vi就会失效
在用户主目录创建 ~/.exrc 或 ~/.vimrc 配置文件,设置选项后,可使每次启动时选项保持不变
4.搜索替换与命令执行
「搜索」
1 | #命令模式下输入 |
按下N是下一个匹配与命令搜索方向相反,按下n为下一个匹配,与命令搜索方向相同
「搜索并替换」
1 | :「行范围」 s/被替换单词/新单词/[g] |
「运行shell命令」
1 | #: ! command |
四、Linux文件系统
1.磁盘组织
目录:Linux文件系统的组织单元
Linux文件系统通过目录对文件进行组织管理,
2.文件类型
UNIX文件视角:
- 文件是字节序列,一切都是文件
- 文件可以分为,普通文件、目录文件、特殊文件
1 | #查看文件类型 |
3.目录详述
目录结构以层次结构进行组织
父子关系:相邻两层目录间的关系
上层目录是下层目录的父目录,下层目录是上层目录的子目录
重要目录:Linux系统的标准目录
「重要目录作用」
「主目录」
主目录:管理员在创建用户的时候为其分配的特定目录
- 用户登录时,自动进入主目录
- 用户在其主目录拥有读、写和执行权限
- 用户在其主目录可以创建任意多的子目录
- 主目录名字通常和用户名相同
「工作目录」
工作目录:用户先在在文件系统中的目录
1 | pwd |
「路径」
路径:文件在文件系统中的位置描述方式
路径名用来定义文件。
绝对路径:从根目录开始到文件的路径
相对路径:从当前目录开始到达文件的路径
「特殊符号」
点(.):表示当前目录
点点(…):表示当前目录的父目录
「命名约束」
文件和目录如何命名。
4.目录操作命令
「cd命令」
1 | cd [目录名] |
1 | cd |
「mkdir命令」
1 | mkdir 目录名 |
1 | #一次创建多层目录 |
「rmdir命令」
1 | #删除目录,只能删除空目录,即目录中只含有.和.. |
「ls命令」
1 | #显示指定目录内容 |
选项 -l:
第二列:文件的链接数
第三列:文件的所有者,通常与文件创建者用户名相同,文件的所有者发生转移,则两者不同
第四列:文件所属的组,管理员创建用户时,指定用户隶属于某个组,用户创建文件时,文件属于用户默认隶属的组
第五列:文件大小,单位字节
第六列:文件上一次修改的日期和时间
第七列:文件的名称
选项 -a:
查看隐藏文件
「cat命令」
1 | #显示一个或多个文件的内容 |
「rm命令」
1 | #删除文件 |
五、UNIX文件系统高级操作
1.shell重定向
「输出重定向」
输出重定向允许用户将命令(进程)的输出保存到文件中
shell使用>和>>作为输出重定向操作符
1 | command > filename #覆盖重定向 |
「输入重定向」
输入重定向允许用户从指定文件得到输入来运行命令
shell使用<和 <<作为输出重定向操作符
1 | comand < filename #命令行中使用 |
2.文件操作命令
「cat命令」
1 | cat filename #命令参数 |
1 | cat > filename #使用cat和输出重定向可以创建文件 |
1 | cat >> filename # 若文件不存在则会创建文件并将键盘输入内容输入到文件中,如存在则追加输入 |
1 | cat filename > filename.copy #复制文件 |
「cp命令」
1 | cp 文件名1 文件名2 #创建文件副本 |
命令选项:
-i:如果目标文件已经存在要求确认
-r:将目录复制到新的目录
「mv命令」
1 | mv 文件名(s) 目录 #将文件移到其他目录(非文件所在目录) |
命令选项:
-i :如果目标文件已经存在要求确认
「ln 命令」
在已存在和新文件名之间创建链接,为已存在的文件起新名字,使用不同的名字引用同一文件
- 在不同目录中频繁操作同一文件
- 在每个目录中建立该文件的链接文件,通过链接文件对原文件进行操作
- 链接文件不占用过多的磁盘空间
涉及文件存储的三个部分
「wc命令」
1 | #计算一个或者多个文件的行数、字数和字符数 |
选项:
-l :统计行数
-c:统计字符数
-w:统计字数
3.文件名替换
「?通配符」
代表单个字符,不可为空
「*通配符」
文件名中的任意个字符(包括0个)
「[] 通配符」
包含括号中指定的任一字符
4.其它文件操作命令
「find命令」
在多层目录中搜索指定文件,快速查看文件指定部分
搜索选项:
-name : 通过文件名查找文件
-type: 通过文件类型查找文件
动作选项:
-exec:用户给出命令,对找到的文件进行操作
-ok:用户执行命令前需要确认
「head命令」
1 | #显示文件头部若干行 |
-n: 显示文件前n行
「tail命令」
1 | #显示文件尾部若干行 |
-n : 显示文件后n行
「cut命令」
1 | #从文件中取出指定域或列 |
-f : 指定域位置 ,1,3,5 1-3,5
-c :指定字符的位置
-d :指定域分隔字符
「paste命令」
1 | # 逐行连接两个或多个文件 |
-d:指定具体分隔符,默认为制表符
「more命令」
1 | #另页查看工具 |
-lines :每屏显示的行数
+line-number :从第line-number 行开始显示
+/pattern : 从包含pattern的行的上两行开始显示
-c :在显示每页之前清屏
-d :显示提示[Press space to continue, ‘q’ to quit]
「less命令」
1 | #分页查看工具,允许在文件中向后和向前移动 |
基于more 和 vi 更高级的工具
5.UNIX 内部:文件系统
六、探索shell
1.启动shell
用户成功登录系统,shell启动,用户退出,shell进程结束
系统中每个用户都有一个默认的shell,在系统口令文件/etc/passwd指定
2.shell的主要功能
「正则表达式」
例子:
POSIX标准正则表达式:
扩展正则表达式:仅在部分程序中支持,例如 egrep、awk 等
例子:
正则表达式与通配符区别:
「echo命令」
1 | #将消息参数显示在用户终端上,没有参数输出空行 |
-n :禁止换行,输出后不换行
-e :解释反斜杠引导的转义字符(用于控制消息格式的字符,字符串的一部分,以\开始由shell解释为用户想要得到的输出)
「消除元字符的特殊含义」
元字符:shell中具有特殊含义和用途的字符,在shell中出现时不代表字面含义
如:
消除元字符特殊含义的元字符:
\ :后面的元字符按照字符的字面量解释
" " : 取消除$、`、\外元字符的特殊含义。双引号中保留空白字符(空格、制表和换行符等)
’ ’ : 单引号中任何字符都失去特殊含义,单引号中保留空白字符(空格、制表和换行符等)
3.shell变量
- shell为响应用户请求,保存一些信息到shell变量中
- 变量有名称,可以通过赋值来控制或定制系统环境
「显示和清除变量:set和unset」
1 | #查看当前使用的shell变量(环境变量和局部变量) |
1 | #删除不需要的变量 |
赋值时,等号左右无空格
「给变量赋值」
「显示shell变量的值」
shell变量可用于在命令行中帮助保存复杂选项或参数
「shell的标准变量」
标准变量:
HOME:保存用户主目录;用于其他命令定位主目录
PATH : 设置shell载入外部命令(程序)时所要查找的目录
路径间的分隔符是 :
PS1 : 设置作为命令提示符的字符串
PS2 : 多行输入一条命令时,设置第二行及以后行的提示符,默认为>
SHELL:设置登录的shell的完整路径
TERM : 设置终端类型
4.其他元字符
「执行命令:使用重音符号 ` 」
1 | # `告诉shell先执行重音符号扩起来的命令,结果替换命令行中原来扩起来的命令,也称命令替换符 |
「命令序列:使用分号 ; 」
1 | #在一个命令行中分隔多个命令,shell从左到右执行 |
「命令编组:使用括号 ( )」
1 | #几个命令放在一对括号中,编为一组执行,编组命令可以被重定向 |
「后台处理:使用 & 符号」
UNIX 是多任务系统,允许同时执行多个程序
「链接命令:使用管道操作符 | 」
| : 将一个命令的标准输出作为另一个命令的标准输入
5.其他UNIX系统工具
「sleep命令」
sleep:使执行该命令的进程延时指定的秒数
「ps 命令」
ps:查看进程详细信息
选项:
-e:显示所有进程
-f: 显示信息的完整列表(包括完整的命令行)
「kill命令」
kill :发信号给指定进程,进行进程间的通信
1 | kill [-signal] PID |
「tee命令」
注意:覆盖式输出。
选项:
-a : 追加而非覆盖
「grep命令」
在一个或多个文件中查找满足特定格式的行
「sort命令」
对文件内容按照字母或者数字顺序排序
6.启动文件
「shell环境配置文件」
「登录shell与非登录shell」
「配置文件功能」
「alias命令」
7.UNIX进程管理
七、程序开发
1.程序的编辑、翻译与执行
「建立可执行程序的步骤」
- 编写源文件(源代码)
- 建立目标文件(目标代码/目标模块)
- 建立可执行文件(可执行代码/载入模块)
「编译/解释程序」
2.编译、链接C/C++程序
gcc : GNU C 编译器,Linux通用 C 语言编译器
g++:GNU C++ 语言编译器
「gcc / g++ 执行编译的步骤」
-
预处理:把头文件展开,去掉注释,宏替换,条件编译等;
生成 .i 文件
-
编 译:将预处理后的文件转换成汇编语言
生成 .s 文件
-
汇 编:由汇编语言变为目标代码(机器代码)
生成 .o 文件
-
链 接:链接目标代码,生成可执行程序
「gcc / g++编译程序」
1 | gcc [选项] 源文件名 |
选项:
-c :只进行预处理、编译和汇编,只生成程序的目标代码文件
-o : 指定生成的可执行程序名,缺省时候生成的可执行程序名是 a.out ;语法: -o 文件名
3.重定向程序输出与出错信息
4.make工具(看不懂原理)
make工具 : GNU工程化编译工具,用于编译众多相互关联的源代码文件
八、shell编程
1.UNIX shell编程语言简介
前提条件:
- 对于使用sh命令的方法:脚本中的命令要与使用的shell兼容
- 对于第二种方法:要先使文件对于用户或所有者具有可执行权限
「退出shell的方法」
1 | exit |
「执行脚本」
1 | sh program #不需要执行权限,在子shell中进行,脚本文件需要与所用shell兼容 |
2.编程基础
「命令置换 ``命令」
将一个命令的输出作为另一个命令的参数(重音符号)
1 | `command` |
「读取输入 read命令」
从标准输入设备读入字符串存入变量中
多变量输入:输入中第1个字符串存入第1个变量,第2个字符串存入第2个变量,…,字符串数多于变量数,所有剩余字符存入最后一个变量
「自定义变量」
1 | 变量名=变量值 |
-
shell不支持数据类型,赋给变量的值解释成字符串
-
变量名遵守与文件命名同样的语法规则
-
变量可以在shell提示符下定义并使用
生存周期:变量保存在内存中,直到脚本结束或终止
「清除变量」:
1 | unset 变量名 |
「显示变量值」:
1 | echo $变量名 |
「命令行参数」:
又称位置变量,用户输入命令时后面跟的数据项,空格分隔
- 参数传递给程序,可以改变程序行为或执行顺序
- 按顺序命令行参数被命名为$0、$1、…$9
- *命令行参数多于9个,第9个之后的被忽略,但可通过$获得
「set 命令」
给位置变量赋值,set参数依次赋值给位置变量
「exit」
shell内部命令,立即终止程序运行
1 | exit n |
- n是退出状态,也称返回码
- 没有提供返回码,使用shell执行最后一条命令的退出值
- 为与其他UNIX程序/命令完成时返回一个退出状态,保持一致,编写shell脚本,返回给父进程一个退出状态
3.条件与测试语句
「if-then」
1 | if [ condition ] |
「if-then-else」
1 | if [ condition ] |
「if -then-eif」
1 | if [ condition1 ] |
「test」
内部命令,它计算作为其参数的表达式的真假
- **真返回0,假返回非0值
- [ condition ]是test命令的一种特殊写法
判断数值:
判断字符串:
文件检测: