Linux课程笔记
Linux和开源
UNIX
诞生
- 时间:1969
- 地点:AT&T 贝尔实验室
- 人物:Ken Thompson和Dennis Ritchie
- 动机:玩游戏
- 理念:简单易用(KISS,Keep it simple, stupid!)
最初使用汇编语言开发,1973年,二人使用C重写了UNIX源码。
发展
UNIX以源代码形式发行,形成了两个重要流派:
| UNIX版本 | 主要发行版分支 |
|---|---|
| UNIX SYSTEM V | AIX、SOLARIS、HP-UX、IRIX |
| Berkeley UNIX | FreeBSD、NetBSD、OpenBSD |
BSD:Berkeley Software Distribution
80年代,UNIX版本剧增,各版本间差别扩大,于是就有了对每种实现必须定义各种限制的说明的标准化。两个重要的标准是:
系统V接口定义(SVID,System V Interface Definition),来自AT&T
可移植操作系统接口(POSIX,Portable Operating System Interface),来自ISO和IEEE
目前几乎所有的UNIX/Linux发行版均遵循POSIX标准。
Linux的兴起
目前应用最广泛的类UNIX系统。2个人4个1:
- 2个人:Richard Stallman & Linus Torvalds
- 4个1:
- 1个项目:GNU
- 1个组织:FSF
- 1个理念:Copyleft
- 1个许可证:GPL
GNU计划
GNU is Not Unix.
1983年9月27日发起,目标:
- 创建一个自由共享、可被任何人修改的类UNIX系统
- 与UNIX兼容
- 不受UNIX名字和代码私有权限制
- 能运行UNIX程序
GNU的执行者是自由软件基金会(FSF,Free Software Foundation),在1985年成立,目标:
- 执行GNU计划
- 提供技术、法律、财政支持
- 开发更多自由软件
GNU完成了许多UNIX应用程序的仿制品,例如:
- GCC
- GDB:源代码级程序调试工具
- GNU make:软件构建工具
- bash
- GNU Emacs:文本编辑器
但是并没有GNU并没有成功开发Linux内核。
GPL许可证
Richard Stallman提出Copyleft(著佐权)概念:著作权归原作者所有,但其他一切权利可以让所有人共享:
- 授予使用者运行、赋值、修改、发行修改后的程序的权利
- 不能在修改后的软件上添加限制
- 修改后的软件要以同等授权方式发布回馈社会
基于Copyleft,Stallman提出了GPL许可证(GNU General Public License)。
GNU开发的工具都在GPL下发行。
意义:
- 确保任何使用自由软件创建的新产品,都必须在GPL协议下发行。
- 以自由软件为基础,修改后重新发行也必须公开源代码。
- 允许商业使用
Linux内核
Linus Torvalds希望开发一个自由,开放源代码的Unix,并在1991年在GPL协议下发布了第一版Linux内核。Linux的吉祥物为Tux。
Linux内核目前在Linux基金会支持下由贡献者共同开发,Linus拥有内核能接受哪些更改和谁可以成为维护者的最终决定权。
Linux既是操作系统内核,又是基于内核的操作系统。Linux=GNU Tools+Linus Kernel,故也称为GNU/Linux。
Linux包括内核版本和发行版本。
- 内核版本由社区(https://www.kernel.org/ )统一发布,包括主、次版本号和修订次数。
- 发行版本的名称和版本号由发行维护者决定,分为商业发行版和社区发行版。
开源软件运动
自由软件运动蓬勃发展后,并非全部自由软件用户和开发者都赞同自由软件运动的目标。1998年,自由软件阵营中的部分成员分裂出来,并以“开源”为名继续开展活动。而后,开源的理念不断兴起,不断发展与壮大,其声势与影响力早已远超自由软件的运动。
埃里克·雷蒙1997在《大教堂与集市》中提出开放源代码软件理念,对自由软件的商业模式加以描述和讨论:自由软件存在的意义不是替代现存的商业软件,共享源代码可以产生更好的结果。
1998年,开放源代码促进会(Open Source Initiative,OSI)成立,推动开源软件发展,统一了开源软件的认证标准。
OSI首次正式提出开源软件的概念:
- 一种源代码可以任意获取的计算机软件
- 软件著作权持有人在软件协议的规定之下保留一部分权利
- 允许用户学习、修改以及以任何目的向任何人分发该软件
- 开源协议通常符合开放源代码的定义的要求
这之后也诞生了一些一些开源许可证,如Apache、BSD、MIT、Mozilla、木兰公共许可证等。木兰开源许可证是中国首个开源许可证,分为木兰宽松许可证和木兰公共许可证。
系统架构
Linux操作系统的结构总体上分为内核空间和用户空间两部分:
内核空间:管理系统资源、提供服务以及控制硬件
用户空间:包括用户应用程序和系统工具,通过内核提供的接口来访问系统资源
内核空间
主要功能有:
- 进程管理
- 内存管理
- 文件系统
- 设备管理
- 网络堆栈管理
- 系统调用
用户空间
包括用户程序和系统工具,重要组件:库函数和shell
库函数即预先编写好的代码,以库的形式组织。库函数执行各种常见的任务,如输入/输出处理、数学计算等,避免开发者重写相同代码,提高程序开发效率和代码可维护性,包括静态库和动态库。
静态库
在程序编译链接时被包含进最终的可执行文件中
程序运行时,静态库中的代码成为程序的一部分
Linux系统中,静态库通常以.a结尾
动态库
在程序运行时被动态加载
多个应用程序可以共享同一份库文件,从而节省磁盘空间和内存
动态库在Linux系统中通常以.so为结尾
shell是一类命令解释程序的统称,为用户提供与操作系统交互的接口。用户通过shell提供的界面输入命令,shell解析这些命令并调用相应的程序来执行,然后将执行的结果反馈给用户。功能有:
命令执行:用户输入命令后,shell查找命令并执行。
重定向和管道
重定向:可将命令的输出保存到文件中,或者从文件中读取输入。
管道:允许将一个命令的输出作为另一个命令的输入。
作业控制:允许用户控制后台作业的执行,如暂停、恢复和终止作业。
脚本编程:shell还是一个程序开发与运行环境,允许用户编写并执行由一系列命令组成的脚本程序,自动实现复杂任务操作。
Linux的核心特征
Linux系统作为一种不断发展的现代操作系统,既继承了类Unix系统的共性,又拥有众多独特特性。
专有软件不是Linux的核心特征。
开源
Linux基于开源协议发布,其源代码可以自由地查看、修改和分发推动了全球范围内的合作与改进,使Linux系统持续进化。
多用户和多任务
多用户即多用户同时共同使用计算机。各个用户执行不同程序,提供安全机制,隔离用户。
多任务即启动一个任务后,继续执行其他任务,并允许用户在前台和后台多个任务间进行切换。
硬件支持与广泛兼容性
Linux支持广泛的硬件平台,包括个人计算机、服务器、嵌入式设备和超级计算机,并能在多种CPU架构上运行,如x86、x86_64、ARM、SPARC等。
Linux与众多开放标准和协议兼容,如POSIX、UNIX规范等。
稳定可靠、网络功能强大与可定制性
Linux成熟稳定,能长时间运行无需重启,在服务器领域应用广泛。
网络功能强大,支持各种网络协议和标准,广泛用于各类网络服务器。
Linux提供高度可定制性,用户可根据自身需求选择不同的桌面环境、窗口管理器和应用程序。其发行版众多,可挑选适合自己的Linux版本。
社区支持
Linux系统获得了广泛的社区支持,社区由开发者、用户和爱好者组成,他们共同贡献代码、分享知识、提供技术支持并推广Linux的使用。
在内核开发方面,有Linux内核社区;几乎每个Linux发行版都有自己的社区,如Ubuntu、Debian、openEuler社区。
基本概念与使用
登录
UNIX是一个多用户操作系统,用户在使用UNIX系统前必须进行登录,登录是识别用户身份、分配资源允许用户使用系统的过程。
登录方式主要有本地登录和远程登录(ssh 用户名@ip地址或域名)。
passwd [username]修改自己或别人的口令,也可以用于生成初始口令(root)。
退出登录shell的三种方法:
exit- [Ctrl+D]
logout
quit不能退出系统。
命令行
用户登录成功后,就能看到用于输入命令的命令行,以及在命令行中为用户提示信息的命令提示符。
最简单的命令提示符只有一个字符:
- 管理员(root):
# - 普通用户:
$
用户可以设置提示符,显示丰富系统信息。
命令行快捷键:
| 快捷键 | 功能 |
|---|---|
| [Ctrl+h] | 删除单个字符 |
| [Ctrl+u] | 删除单行 |
| [Ctrl+a] | 跳到开头 |
| [Ctrl+e] | 调到结尾 |
| [Ctrl+c] | 中断运行 |
| [Ctrl+z] | 挂起程序 |
| [Ctrl+l] | 清屏 |
| [Tab] | 自动补全 |
命令
命令分为外部命令和内部命令。
- 外部命令:磁盘中程序的命令(
man,info) - 内部命令:shell本身的一部分或shell内部识别、执行的命令,执行速度快(
help)
不同的流派Unix选项写法不同,但一般会兼容:
| 流派 | 连接符写法 | 选项表示 |
|---|---|---|
| System V(常用) | - | 字母 |
| BSD | 字母 | |
| GNU | -- | 单词 |
终端
通过who命令可以查看登录终端。
物理终端:一套输入输出设备,用于用户登录和使用计算机;如连接在计算机上的显示器、键盘鼠标;与名词主机对应
虚拟终端(tty,teletypewriter,电传打字机的简称):附加在物理终端之上,用软件方式虚拟实现。类Unix系统启动后默认为用户创建几个虚拟终端,实现多用户的同时登录或单用户的多终端登录。虚拟终端对应的设备文件是
/dev/tty#(#为非负整数)。终端为
:0时表示是图形用户界面终端。
虚拟终端可以使用虚拟控制台实现。Linux通常启用6个虚拟终端:tty1图形终端,tty2-tty6字符终端。可以使用虚拟控制台切换虚拟终端:
- 切换方式1:Ctrl-Alt-F[1-6]
- 切换方式2:
#chvt n
通过tty命令来查看当前的虚拟终端号。但是tty并不都是虚拟终端。
伪终端(pty)是由远程登录软件或终端模拟软件模拟出的终端,主要有两种应用场景:
- 图形界面下进行命令操作
- 远程登录
pts(pseudo-terminal slave)是pty的实现方法。伪终端以pts/n的形式命名。
使用whoami可以查看用户名,who am i可以查看终端号等。
shell
shell有很多种类,在/bin/*sh中:
| 名称 | 解释 | 功能 |
|---|---|---|
sh | Bourne Shell(sh) | 大多数UNIX操作系统的标准shell和默认shell |
ksh | Korn Shell(ksh) | Bourne Shell的一个超集,sh程序可以不修改在ksh上运行 |
csh | C Shell(csh) | 由加州大学伯克利分校开发,采用C语言风格的语法 |
bash | Bourne Again Shell(bash) | Linux的标准shell和默认shell,基于sh |
只需要键入新shell名就可以更换shell。本质是创建shell子进程,在子进程中运行新shell。如果想永久改变,可以修改账户配置文件/etc/passwd或使用chsh命令。
安装软件
编译源代码安装与基于网络存储库安装。
编译软件源代码:
从软件的官方网站或可信的第三方网站下载软件的源代码,然后使用编译工具进行编译完成安装过程。这种安装软件方法较为灵活,可以选择下载特定版本或者最新版本。软件包每次更新都需要重新编译,对初学者存在一定难度。
基于网络存储库安装
各种Linux发行版有许多官方和非官方的软件存储库,保存了大量经过编译的软件包,可以直接用于安装或更新。可以通过包管理器工具访问存储库,选择所需软件进行安装或更新。简单易行,适合初学者。软件已经过编译,安装速度比从源代码编译更快。
基于网络库的安装工具有两种,dnf和apt:
| 安装工具 | 介绍 |
|---|---|
| apt(Advanced Package Tool) | 基于Debian的Linux发行版中使用的包管理器。提供命令行界面,使户能够方便搜索、安装、更新和卸载软件包。具有自动解决依赖关系的功能,可以快速地安装复杂的软件包集合。还提供了软件仓库管理功能,允许用户方便地添加、删除和配置软件仓库。 |
| dnf(Dandified YUM) | dnf 是 YUM(Yellowdog Updater, Modified)的下一代版本管理器,旨在解决 YUM 的一些性能和依赖管理问题,并提供更好的用户体验。提供了命令行界面,支持软件包的搜索、安装、更新和卸载。具有速度快、可扩展性强,支持并可以通过插件来扩展其功能,支持多线程并发下载和安装,提高了软件包的安装速度 |
dnf命令语法格式为dnf [子命令] [选项] [软件包名称...],常用子命令有:
| 命令 | 介绍 |
|---|---|
install | 安装软件包 |
update | 更新软件包 |
remove | 卸载软件包 |
grouplist | 显示所有可用的软件包组,包括已安装的和未安装的 |
groupinstall | 安装软件包组 |
常用选项有-y,即对安装过程中所有的询问表示同意。
可以使用yum(dnf)安装软件包组。软件包组是服务于一个共同的目的一组软件包,例如系统工具集等。使用dnf可以对软件包组进行安装/删除等操作,使相关操作更高效:dnf groupinstall -y “Development Tools”
系统启动或关闭
Linux系统的关闭通常由关机命令触发,为确保系统安全、稳定地关闭,一般包括以下关键步骤:
- 管理员发起关机请求:在命令行中输入
shutdown、halt或poweroff等命令请求关闭系统 - 系统发送关机信号:系统初始化进程(如systemd)收到关机命令后,执行关机流程
- 停止所有运行的服务:停止所有正在运行的服务和进程,如网络服务、文件共享服务等
- 卸载文件系统:系统卸载所有已挂载的文件系统,以防止数据损坏
- 执行自定义关机脚本:系统可能会运行预定义的关机脚本,进行数据同步、清理缓存等操作
- 关闭硬件设备:系统通知所有硬件设备安全关闭,如硬盘驱动器停止运转
- 关闭电源:系统关闭计算机的电源
关机命令
shutdown [选项] [时间]命令:关机或重启。
主要选项有:
h:停止系统,关机r:重启系统
例如:
# shutdown -h now:立即关机# shutdown -h 22:45:在22:25关机# shutdown -r +30:30分钟后重启
reboot命令:重启。
halt命令:在大多数系统中等效于shutdown -h now。
poweroff命令:首先关闭所有运行的服务,卸载文件系统,然后关闭系统电源。
vi编辑器
打开vi的命令:vi [选项] [文件]。常用选项有:
-c:打开时执行指定的vi命令-R:只读打开,可强制保存-M:只读打开,不可强制保存-r:恢复文件+num:从第num行开始
保存::[ a,b(保存从a至b行到) ] w [新文件名],例如: 1,4 w test.c。
退出::q,使用:q!强制退出。使用:x、:wq或[Z][Z]保存并退出。
vi的:version命令可以显示当前的vi版本等信息。
输入模式
启动vi后自动进入命令模式,输入:进入ex命令模式(又称为末行模式),按[i]、[I]、[a]、[A]、[o]、[O]进入输入模式。输入模式按[Esc]回到命令模式。
| 按键 | 功能 |
|---|---|
| [i] | 在光标左侧输入文本 |
| [I] | 在光标所在行开头输入文本 |
| [a] | 在光标右侧输入文本 |
| [A] | 在光标所在行结尾输入文本 |
| [o] | 在光标上面创建新行,输入文本 |
| [O] | 在光标下面创建新行,输入文本 |
移动光标
在命令模式下,除了方向键,也可以用别的按键移动光标:
| 按键 | 功能 |
|---|---|
| h | 左移 |
| Backspace | 左移 |
| j | 下移 |
| 回车 | 下移到下一行行首 |
| k | 上移 |
| l | 右移 |
| 空格 | 右移 |
| nh | 左移n格 |
| nj | 下移n格 |
| nk | 上移n格 |
| nl | 右移n格 |
大范围移动光标:
| 按键 | 功能 |
|---|---|
| 0 | 移动到行首 |
| $ | 移动到行尾 |
| nw | 向右移动n个单词(跨行) |
| nb | 向左移动n个单词(跨行) |
| ne | 移动到后n个单词的词尾(跨行) |
| gg | 移动到最开头 |
| G | 移动到尾行行首 |
| nG | 移动到第n行行首 |
| :n | 移动到第n行行首 |
| [Ctrl]+[g] | 获取行号 |
删除文本
| 按键 | 功能 |
|---|---|
| nx | 删除光标开始的n个字符 |
| nc{范围限定符} | 删除光标开始的n个限定范围,然后进入插入模式 |
| nd{范围限定符} | 删除光标开始的n个限定范围 |
| 范围限定符 | 意义 |
|---|---|
| 0 | 光标之前到行首,不包含光标 |
| $ | 光标开始到行尾 |
| w | 光标开始到词尾 |
特殊的,有一些删除命令:
| 按键 | 功能 |
|---|---|
| ncc | 删除本行开始的n行,然后进入插入模式 |
| ndd | 删除本行开始的n行 |
复制
| 按键 | 功能 |
|---|---|
| ny{范围限定符} | 复制光标开始的n个限定范围 |
| 范围限定符 | 意义 |
|---|---|
| 0 | 光标之前到行首,不包含光标 |
| $ | 光标开始到行尾 |
| w | 光标所在的单词 |
| y | 光标所在的行 |
粘贴
| 按键 | 功能 |
|---|---|
| p | 粘贴到下一行或光标右边的位置 |
| P | 粘贴到上一行或光标左边的位置 |
需要注意的是,使用dd删除文本时,它会同时被复制。
撤销和重做
| 按键 | 功能 |
|---|---|
| u | 撤销最近的一次修改 |
| U | 撤销当前行的所有修改 |
| [Ctrl]+[r] | 撤销撤销操作 |
| . | 重复上一次的修改 |
查找
| 按键 | 功能 |
|---|---|
/[文字] | 向后搜索 |
?[文字] | 向前搜索 |
| n | 定位到下一个项,与命令方向相同 |
| N | 定位到上一个项,与命令方向相同 |
替换
使用s命令:: [行范围(默认为当前行),%表示全文] s / {被替换项} / {替换项} / [g(全行替换,如果没有g则会只替换每一行的第一个)][c(确认后再替换)]
环境设置
通过选项可以定制vi编辑器的行为。主要使用:set {选项}命令。
:set:显示修改过的选项的值。:set X?:显示选项X的值。:set all:查看所有选项以及它们的设置。- 布尔值选项:使用
:set X或:set noX以设置或取消。 - 数值型选项:使用
:set X=number,注意等号前后无空格。 - 字符串选项:使用
:set X=string
有很多选项可以设置:
| 选项 | 性质 | 默认值 | 功能 |
|---|---|---|---|
nu | 布尔值 | nonu | 显示行号 |
ts | 数值型 | 缩进宽度 | |
ai | 布尔值 | 自动缩进 | |
mouse | 字符串 | 使能鼠标 | |
encoding | 字符串 | 编码方式 |
在vi中设置的都是暂时的,退出即失效。需要修改配置文件达到永久效果。路径有:
| 路径 | 性质 |
|---|---|
/etc/virc | 全局配置文件 |
/$HOME/.virc | 用户配置文件 |
/$HOME/.vim/virc | 用户配置文件 |
/$HOME/.exrc | 用户配置文件 |
优先级递减。
在vi中执行shell命令
输入:!{command}、:r !{command}可以将执行结果加入文本当中,:r {文件名}可以将文件内容插入文本,一般都是在下面起新的一行。
Linux文件系统
磁盘从逻辑上划分一个到多个分区,每个分区被格式化为特定类型的文件系统,在每个分区中,文件系统通过目录来组织文件。
目录可以看做一种容器,用于组织和管理其他文件和目录。Linux提供命令,在磁盘上创建、组织和查找目录和文件。
Linux继承了UNIX对文件的广义定义,一切皆文件。主要有:
- 普通文件:数据的集合,如文本、图像、音频、视频、程序等
- 目录文件:用于文件的组织,包含关于其他文件的信息
- 特殊文件:包含与外部设备相联系的信息,系统中每个设备分别对应一个文件
目录
目录本质上是一个账本,记录了该目录中包含的文件和子目录的名称,以及它们在文件系统中的位置(通过inode编号)。
目录以层次形式进行组织,从根目录/向下延伸。
特殊的目录
| 目录 | 作用 |
|---|---|
/ | 根目录(root目录),包含了整个文件系统,目录树起点 |
/bin | 存放用户可以使用的可执行文件(外部命令,例如cal、date、who、sh、bash),有的系统存放在/usr/bin |
/sbin | 存放系统管理员(root)可以使用的系统管理命令(agetty、fsck、halt、reboot、shutdown、useradd),有的系统存放在/usr/sbin、/usr/local/sbin |
/lib或/lib64 | 存放函数库和模块文件,有的系统存放在/usr/lib、/usr/lib64 |
/boot | 存放Linux系统启动时用到的文件(内核:/boot/vmlinuz-*启动配置文件:/boot/grub2等) |
/dev | 存放设备文件。设备文件是一种特殊文件,代表计算机物理部件或虚拟部件(/dev/tty代表终端,/dev/null代表空设备) |
/mnt,/media | 用于临时挂载其他文件系统 |
/proc | 虚拟文件系统,将内核和进程运行状态归档为文本文件,通过这些文件可以查看硬件和正在运行的进程信息(使用cat /proc/meminfo或cat /proc/cpuinfo) |
/root | 管理员root的主目录 |
/home | 存放所有普通用户主目录 |
/etc | 存放系统管理所需的配置文件(/etc/passwd,/etc/profile)和子目录,如用户信息、服务的启动脚本、常用服务的配置文件等 |
/usr | 存放应用程序。/usr/bin存放用户应用命令;/usr/sbin存放管理员使用的系统管理命令;/usr/src存放内核源代码 |
/opt | 主机额外安装软件的目录 |
/var | 存放经常变化或增长的文件,如日志、缓存、邮件、打印队列等。/var/log存放各种程序的日志文件 |
/run | 存放一些服务和程序运行后产生的信息,如进程ID、锁文件、套接字等。 |
/tmp | 存放临时文件,所有用户都可以访问和写入。 |
/sys | 存放与内核相关的信息,如/sys/module,/sys/class等 |
/srv | 存放一些服务启动后需要提取或访问的数据,如FTP服务、Web服务等 |
主目录和工作目录
主目录是管理员在创建用户时为其分配的特定目录。用户登录时,自动进入主目录,其名称通常与用户名相同。
root用户的主目录是/root。
工作目录是用户现在在文件系统中所在的目录。
文件命名规则
- 长度约束:1 ~ 255个字符
- 唯一性约束:同一目录下不得存在同名文件
- 大小写敏感
- 字符约束尽量避免使用
<、>、(、)、[、]、{、}、*、?、”、’、-、$、^、空格 - 推荐使用
A~Z、a~z、0~9、_、.
文件操作命令
cd命令
用于改变工作目录(change directory)。
cd:返回用户主目录。
cd ~ [用户名]:进入其他用户或自己的主目录,前提是拥有权限。
mkdir命令
创建目录,可以一次创建多个。
-p选项,可以一次创建多层目录。
rmdir命令
删除空目录。
ls命令
显示目录内内容(list)。
| 选项 | 作用 |
|---|---|
-a | 列出包含隐藏文件的所有文件 |
-l | 显示详细信息 |
-d | 列出目录文件本身,而不列出目录中的文件 |
-i | 列出文件的索引节点 |
-l显示格式例如:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|
-rw-r--r-- | 1 | david | stu | 48 | Jun 25 12:28 | 文件名 |
| 文件类型与权限 | 链接数 | 创建者 | 所属的组 | 文件大小(字节) | 最后修改时间 | 文件名 |
在第一列中,第1个字符表示文件类型,第2 ~ 10个字符表示权限设置。
第1个字符的意义:
| 字符 | 类型 |
|---|---|
d | 目录文件 |
- | 普通文件 |
b | 块设备文件 |
c | 字符设备文件 |
l | 链接文件 |
第2 ~ 10个字符分三组,所有者、组用户、其他人,分别对应3个字符。
| 字符 | 类型 |
|---|---|
r | 读权限 |
w | 写权限 |
x | 执行权限 |
- | 无权限 |
第二列表示文件的链接数。
第三列表示文件的所有者,通常与创建者相同,可以发生转移。
第四列表示文件所属的组,创建时属于用户所在的组。
第五列表示文件大小,单位为字节。
第六列表示上一次修改的时间。
第七列表示文件名。
-a可以显示隐藏文件,即以.开头的文件。
cat命令
显示一个或多个文件的内容。
more命令
分页显示文件。
head命令
显示前若干行内容,默认为10行。
通过-n选项指定显示多少行。
tail命令
显示后若干行内容,显示行数和-n用法与head相同。
可以使用-f持续显示内容,用于监控文件是否有新增,直到[Ctrl]+[C]停止命令。
wc命令
用于统计行数、字数(不含空格或制表符的字符串)、字符数。
若没有指定文件名,则从键盘输入,直到按下[Ctrl]+[D]。
| 选项 | 作用 |
|---|---|
-l | 统计行数 |
-c | 统计字符数 |
-w | 统计字数 |
diff命令
比较两个文件内容是否一致。
| 更改提示 | 作用 |
|---|---|
a | 增加的行 |
d | 删除的行 |
c | 修改的行 |
可以选择选项来忽略大小写、忽略空格等操作。
rm命令
删除文件。
| 选项 | 作用 |
|---|---|
-i | 删除前要求确认 |
-r | 递归删除目录下所有文件 |
-f | 强制删除 |
cp命令
复制。用法有:
cp {文件名1} {文件名2}cp (多个){文件名} {目录}
| 选项 | 作用 |
|---|---|
-i | 若目标文件已存在则要求确认是否要覆盖 |
-r | 递归复制目录下所有文件 |
mv命令
移动文件。用法有:
mv {文件名1} {文件名2}:移动文件并改名mv (多个){文件名} {目录}
选项同cp命令。
ln命令
在已存在文件和新文件中创建链接,类似于引用。改变一个文件,链接的文件也会被改变。用法有:
ln {已存在的文件} {新文件名}ln (多个){文件名} {目录}:在目录中创建同名的链接文件
| 选项 | 作用 |
|---|---|
-s | 创建软链接,类似于快捷方式,其中包含路径指针,访问它就是访问源文件的路径 |
paste命令
用于按列合并。用法是paste [选项] {(多个)文件名}。
| 选项 | 作用 |
|---|---|
-d | 指定分隔符,默认是制表符\t |
-s | 将每个文件的每一行都按顺序拼接到一行上 |
文件名匹配
shell允许用户使用指定的模式匹配文件名:
| 字符 | 作用 |
|---|---|
? | 匹配任意单个字符 |
* | 匹配任意的0 ~ n个字符 |
[列表] | 匹配文件名中任一在列表中的字符 |
[!列表] | 匹配文件名中任一不在列表中的字符 |
[列表]和[!列表]是不能为空字符的。
需要注意的是,rm -rf report*和rm -rf report *差别很大。前者是删除所有report开头的文件,后者是删除report,然后删除所有文件。
搜索命令
find命令
用于搜索文件。格式为find {路径名} {搜索选项} {动作选项}。
搜索选项
| 选项 | 作用 |
|---|---|
-name | 根据文件名查找 |
-type | 根据类型查找 |
-size n | 根据大小查找 |
-mtime n | 根据最后修改日期查找 |
根据文件名查找,使用通配符时,需要用引号扩起文件名。
文件类型
| 字符 | 类型 |
|---|---|
d | 目录文件 |
f | 普通文件 |
b | 块设备文件 |
c | 字符设备文件 |
逻辑查找符
| 查找符 | 意义 |
|---|---|
-a | 与 |
-o | 或 |
! | 非 |
() | 逻辑组合 |
例如find /dev -type b -o -type -c。
动作选项
| 选项 | 作用 |
|---|---|
exec command {} \; | 对找到的文件执行command |
ok command {} \; | 执行前要求确认 |
{}是一个占位符,会代表find查找到的所有路径。\是转义符,因为;是一个特殊符号。\;是命令结束的标志。
grep命令
在多个文件中查找满足格式的行,格式为grep {字符串} [文件名]。找到满足条件的行会从终端输出,若无指定文件则从键盘读入。
| 选项 | 作用 |
|---|---|
-c | 只显示符合的行数 |
-j | 忽略大小写 |
-l | 只显示文件名 |
-n | 输出前显示行号 |
-v | 只显示不匹配的行 |
cut命令
| 选项 | 意义 | 备注 |
|---|---|---|
-f | 指定域位置 | 如1,3,5、1-3,5,默认分隔符为制表符,即取出每行被制表符分割的第1、3、5列 |
-c | 指定字符位置 | 如1,3,5,即取出每行第1、3、5个字符 |
-d | 指定域分割字符 | 可以和-f一同使用,后面跟非默认分隔符,空格和其他有特殊意义的字符必须用双括号括起来 |
排序命令
sort命令
| 选项 | 作用 |
|---|---|
-d | 按字典序排序,忽略标点符号和控制字符 |
-f | 忽略大小写 |
-n | 数字以数值排序 |
-g | 数字以数值排序,且可以处理浮点数 |
-o | 输出存储在文件中 |
-r | 倒序排序 |
-k | 按指定字段排序,就是指定第几个域来排序 |
-u | 去除重复行 |
-c | 检查是否已经排序好了 |
文件权限
文件权限的意义和目录权限不同:
| 读权限 | 写权限 | 执行权限 | |
|---|---|---|---|
| 文件 | 读取内容 | 修改内容和删除文件 | 作为程序执行 |
| 目录 | 列出内容 | 创建、删除、重命名文件和子目录 | 进入该目录 |
文件权限可以使用3位8进制数表示:
r=4w=2x=1-=0
默认权限
文件和目录的默认权限:
- 文件:
666 - 目录:
777
可以使用umask掩码表示默认情况下那些权限不会赋予新建的文件、目录,则初始权限为:
- 文件:
666-umask - 目录:
777-umask
设置掩码可以用umask {数值}命令实现。
chmod命令
更改文件权限,格式为:chmod {字符串} {文件名}。
字符串包括:
- 对象:
u、g、o、a,分别表示用户、组用户、其他用户、所有用户(代替ugo) - 操作符:
-、+、=,分别表示赋予权限、取消权限、设置权限 - 权限:
r、w、x、-
也可以使用chmod {三位八进制数} {文件名}修改权限。
索引节点
Linux将每个文件和一个整数(索引节点号)关联,用来标识每个文件。索引号对应文件的基础信息保存在索引节点表(inode)中,存储在磁盘里。
Linux打开文件的过程是:
- 查找目录项,获得索引节点号
- 找到文件的索引节点
- 读取元数据
- 定位文件数据
文件名本质上是索引节点号的别名。
shell
shell是一个用户操作界面,是用户和内核交互的桥梁。登录系统后,shell启动;退出时,shell进程结束。
每个用户都有一个默认shell,通常在/etc/passwd中指定。
shell的功能
- 管道
- IO重定向
- 文件名替换
- 环境控制
- 后台处理
- 命令执行
- shell脚本
注意:shell不能够装载内核。
echo命令和元字符
将消息参数显示在终端上。
| 选项 | 作用 |
|---|---|
-n | 禁止换行(转义符\c也可以) |
-e | 解释反斜杠引导的转义符,且转义字符必须用""括起 |
元字符指的是shell中具有特殊含义与用途的字符。消除元字符可以使用:
\:后面的字符按照字面解释"":括起来的字符除了$、`和\以外都按照字面解释'':括起来的字符全按照字面解释
shell变量
shell为了响应用户请求,会将一些信息保存在shell变量中:
- 环境变量用于配置和定义系统或用户环境,shell启动时就被创建并被赋予初始值
- 局部变量可以供用户定义shell函数或脚本,用户可以自己定义、修改、删除它们
set、unset命令和变量赋值
set可以查看当前使用的所有shell变量,包括局部变量。unset用于删除不需要的变量。
可以直接使用变量名=变量值的方法赋值。
变量前加$访问变量值。
变量可以在命令行中保存复杂的参数或选项:
1 | |
1 | |
环境变量
PATH变量设置shell载入外部命令时依次进行查找的目录,路径间分隔符为冒号:,执行内部命令时不会查找,而是直接执行HOME变量用于保存用户主目录,用于其他命令定位主目录,即/home/用户名,cd命令没有参数时,自动回到HOMEPS1设置作为命令提示符的字符串。PS1中可以使用转义序列,需要用""括起:
| 序列 | 意义 |
|---|---|
\u | 用户名称 |
\h | 机器主机名 |
\w | 工作目录(完整路径) |
\W | 工作目录(最底层) |
\$ | 若用户为root,则显示#,否则显示$ |
\s | 当前运行的shell名称 |
\d | 当前日期 |
\t | 当前时间 |
\! | 命令序号 |
PS2设置多行输入命令时(尾部写\),第二行及以后的提示符SHELL设置登录shell的完整路径,默认为/bin/bashPWD保存当前目录的路径
输入输出重定向
shell输入输出可以重定向到文件中。
>是覆盖输出重定向,直接覆盖已有的文件或新建一个文件>>是追加输出重定向,在源文件末尾继续写2>是标准错误重定向<是输入重定向,从文件中读取信息<<是多行输入(Here Document),用于直接从命令行中输入多行数据
环境变量的值被修改时,修改作用只会作用于当前会话,暂时改变。只有修改配置文件才能永久改变。
shell元字符
|元字符
|被称为管道,将一个命令的输出传递给令一个命令作为输入,是命令行中实现进程间通信(ICP)的机制
tee命令可以将标准输入的内容同时输出到标准输出和一个或多个文件中,通常以{command} | tee [选项] {(多个)文件名}为用法,把命令的输出同时输出到终端和文件中。
`元字符
`告诉shell先执行重音符号括起来的命令,命令的输出替换原来括起来的部分,例如:
1 | |
;元字符
;在命令行中分隔多个命令,从左至右执行。
()元字符
几个命令编在一个括号中,变成一组执行,例如:
1 | |
后台处理
使用{command} &可以让命令在后台运行。
多个命令一般可以直接写作{command1} & {command2} &而不需要;分隔,注意&前后有空格。
进程
sleep命令
使进程延迟多少秒再执行下一个命令。
ps命令
不带选项时显示当前终端用户活动进程的状态。
| 信息 | 意义 |
|---|---|
| PID | 进程ID |
| TTY | 控制进程的终端号 |
| TIME | 进程已运行的时间(秒) |
| CMD | 命令名 |
| 选项 | 意义 |
|---|---|
-f | 显示完整的进程列表和命令行 |
-e | 显示所有进程 |
使用ps aux(或-aux,可能报错)和ps -ef命令可以查看所有进程的状态。-ef写作ef可能会被误认为是进程名。
kill命令
用于发信号给进程,进行进程通信。
| 选项 | 意义 |
|---|---|
-l | 展示信号列表 |
命令格式:kill [-信号编号或信号名] {PID}。
9号信号或SIGKILL为强行结束进程15号信号或SIGTERM为正常结束进程,一般不指定信号则默认发送15号信号
用户只能终止自己的进程,管理员可以结束所有进程。
PID为0时,指的是当前进程所在组的所有进程,而不是一个单独的进程。
shell配置文件
配置文件包含了各种命令和设置,用于定义变量和别名等。
系统配置文件有:
/etc/profile:设置系统整体环境与自启动程序;登录时执行/etc/bashrc:设置系统整体函数与缩写;打开bash时执行
用户配置文件有:
~ /.bash_profile:设置登录用户的bash环境;执行~ /.bashrc~ /.bashrc:设置当前用户的bash环境;执行/etc/bashrc~ /.bash_logout:用户退出bash时执行
关于非登录shell和登录shell:
- 登录shell是通过了账户密码环节的启动的shell,执行
~ /.bash_profile、~ /.bash_login或~ /.profile - 非登录shell是在已登录的shell中打开新的shell时启动的,执行
~ /.bashrc
/etc/profile文件
是一个ASCII文件,定义全局环境变量,如PATH等。
也可以设置umask值。
/etc/profile.d是一个文件夹,保存应用程序所需的启动脚本,如颜色、语言等。
/etc/bashrc文件
用于配置系统函数和缩写等,用户每次登陆环境都被读取,执行.bashrc文件:配置用户专用的bash环境。
.bash_logout在退出bash时执行。
export命令
使一系列shell变量用于子shell。
alias命令
为命令起一个名字:alias {别名}={命令名},如果有空格则要用""括起来。没有参数则显示已定义的别名。
使用unalias取消别名。
gcc和git
编译
gcc是GNU C编译器,g++是C++编译器,它们执行编译的步骤是:
- 预处理:把头文件展开,去掉注释,替换宏,条件编译,产生
.i文件(选项-E) - 编译:转换为汇编语言,产生
.s文件(选项-S) - 汇编:转换为机器语言,产生
.o文件(选项-c) - 链接:链接目标代码,生成可执行程序(选项
-o,以指定输出的文件名,默认为.out)
make工具
是GNU工程化编译工具,用于编译同一项目中众多相互关联的源码文件,将维护命令和编译命令写在makefile文件中,实现合理编译。
主要解决的问题有:
- 大项目源码维护
- 减少重复编译时间:自动判断哪些代码修改过,只对改动后的代码进行编译
makefile语法规则:
1 | |
例如:
1 | |
make命令的用法:make [-f file] [targets]。
make默认会在工作目录中寻找makefile文件作为输入,而-f指定其以外的作为输入。
如果没有指定的目标,则make会默认实现makefile的第一个目标然后退出,可以指定一个或多个目标,用空格分隔。
例如make clean命令,就是执行上方的clean目标。
git
git是Linus为了更好管理Linux内核开发而开发的开源分布式版本控制系统。
配置邮箱和用户名
1 | |
这是仓库级配置,只会影响本仓库。
全局配置如:
1 | |
克隆仓库
git clone {远程仓库链接}。
克隆成功后用户会在本地拥有一个完全相同的git副本。
提交修改
- 将文件添加到暂存区:
git add {目录或.} - 提交暂存区的修改到本地仓库:
git commit -m "说明信息"
推送和拉取修改
git push {远程仓库} {本地分支}将本地分支推送到远程仓库。
git pull {远程仓库} {远程分支}将远程分支的更改合并到本地分支。
分支
分支是一种软件项目管理不同版本的方法。可以通过创建分支将项目分割成独立的开发线,每个分支可以拥有自己的代码库和开发人员。
分支操作有:
- 列出分支
git branch - 创建分支
git branch {分支名} - 切换到分支
git chechout {分支名} - 删除分支
git branch -d {分支名}
其他git操作
- 查看当前状态
git status - 查看提交历史
git log - 查看和修改配置
git config
shell编程
shell脚本无需编译,易于编写。一个shell脚本会将命令一次交给shell执行,一次一条,直到停止或出错。以#为注释。
shell的程序文件被称为脚本、shell过程或shell脚本。
执行脚本有三种方式:
- 启动新的shell,例如
sh hello.sh或ksh hello.sh。 - 使用当前shell执行,运用
.命令或source命令,例如. hello.sh和source hello.sh - 将其转换为可执行文件,如
chmod u+x hello.sh,然后再使用./hello.sh
变量
shell变量不需要先定义后使用,不支持数据类型,赋值都解释为字符串。
变量保存在内存中,直到其所在的shell进程结束或被unset清除。
直接将两个字符串放在一起就能够完成字符串拼接(注意被拼接的成员间不能有空格)
shell没有内部运算符供算术运算。
算术运算
expr命令
用于进行算术运算。运算符有:+、-、\*、/、\%,运算后输出到标准输出。符号左右要有空格,且参数只能是整数。
expr中使用变量,需要用$取值。
expr中也有逻辑运算符,写作=、!=、\<=、\>=、\<、\>。
let命令
进行整数计算,并将表达式的值赋给变量。例如:
1 | |
运算符左右不需要空格,且无需$取值,可以直接使用。运算符也不需要转义符了。
(())运算符
支持将算术赋值表达式放到双括号中。变量用法和let一样。
命令行输入
命令行参数又称为位置变量,是用户输入命令后在后面跟着的数据,使用空格分隔,传送给程序。按照顺序,参数会被命名为$0到$9。
| 位置变量 | 含义 |
|---|---|
$0 | 脚本文件名 |
$1 ~ $9 | 第1 ~ 9个命令行参数 |
$# | 命令行参数的个数 |
$@ | 所有命令行参数,参数加引号时每个参数会被认为是一个字段(推荐使用) |
$* | 所有命令行参数,参数加引号时每个参数都被合并成一个字符串 |
$? | 上一个命令返回的结果 |
$$ | 正在执行进程的PID |
命令行参数多于9个时,后面的会被忽略,但是仍可以用$*获得。
使用set可以给$1 ~ $9依次赋值。
read命令
从标准输入中读入字符串,存入变量中。若字符串数量多于变量的数量,则最后一个变量会存下剩下所有的字符串。
条件语句
if-then结构:
1 | |
if-then-else结构:
1 | |
if-then-elif结构:
1 | |
test命令
条件表达式[ condition ]等效于test condition命令,真返回0,否则返回非0。注意,test命令中字符串必须使用""括起。一般字符串的写法是:test [选项] {字符串}。
字符串比较与检测:
| 操作符 | 示例 | 含义 |
|---|---|---|
= | $str1 = str2 | 相同返回0 |
!= | $str1 != str2 | 不同返回0 |
-n | -n $str | 包含字符返回0 |
-z | -z $str | 不包含字符(空串)返回0 |
数值比较:
| 操作符 | 含义 |
|---|---|
-eq | 相等返回0 |
-ne | 不等返回0 |
-gt | 左大于右返回0 |
-ge | 左大于等于右返回0 |
-lt | 左小于右返回0 |
-le | 左小于等于右返回0 |
test也可以检测文件属性:
| 操作符 | 含义 |
|---|---|
-r | 文件是否存在且可读 |
-w | 文件是否存在且可写 |
-s | 文件是否存在且长度非零 |
-f | 文件是否存在且是普通文件 |
-d | 文件是否存在且是目录 |
例如,检验file1是否为普通文件:
1 | |
test命令也可以使用逻辑运算符组合条件,例如test {表达式1} {运算符} {表达式2} ...,等效于[ {表达式1} {运算符} {表达式2} ... ]。
| 逻辑运算符 | 含义 |
|---|---|
a | 与 |
o | 或 |
! | 非 |
多个test也能组合:test {表达式1} {逻辑运算符} test {表达式2},等效于[ 表达式1 ] {逻辑运算符} [ 表达式2 ]。
| 逻辑运算符 | 含义 |
|---|---|
&& | 与 |
| ` | |
! | 非 |
分支语句
1 | |
循环语句
for循环
1 | |
取值列表可以有很多种:
- 列出所有成员,例如
in file1 file2 file3 - 等差数列,例如
{起始值..结束值..步长}(步长为1可省略)或seq 起始值 步长 结束值(步长或起始值为1均可省略) - 命令的执行结果
while循环
1 | |
只要condition为0就一直执行。
until循环
写法和while一样,但是它是只要condition不为0就一直执行。
终止控制
continue结束本轮循环,进入下一次循环break结束循环
程序返回
exit命令可以立刻终止程序运行,格式为exit n,n为返回码。
系统管理
磁盘和文件系统管理
磁盘和磁盘分区是文件系统管理的基础,以设备文件的形式存在,并允许用户通过系统工具,如mkfs和mount进行操作,例如创建、挂载文件系统和格式化等。
磁盘和磁盘分区设备文件位于/dev目录下,命名为xxyn:
xx表示设备类型hd:IDE磁盘sd:SATA等磁盘vd:虚拟磁盘
y表示设备编号,a为第1个,以此类推n为磁盘分区号1~4为主分区或扩展分区5以后为逻辑分区
/dev/xxy是一个整体的磁盘,dev/xxyn是这个磁盘上的一个分区。
fdisk命令
对磁盘进行分区。语法为:fdisk {磁盘设备名}。使用-l选项可以显示磁盘分区表信息。
例如:
1 | |
lsblk命令
用于列出块设备信息,用途与fdisk -l类似。
blkid命令
用于查看块设备的文件系统类型,LABEL、UUID等信息。
mkfs命令
用于在磁盘分区上创建文件系统,语法为mkfs [选项] {磁盘分区名},选项-t用于创建执行的文件系统类型。例如:
1 | |
mount命令
用于挂载磁盘分区,语法为mount [选项] {磁盘分区文件} {目录}。
1 | |
umount命令
用于卸载文件系统,umount {设备文件名/挂载文件系统的目录名}。
df命令
列出磁盘分区空间使用情况,-h选项以易读方式显示。
du命令
显示目录的磁盘使用情况。-a选项显示目录中目录和文件的占用情况。
归档和压缩:tar工具
打包
使用tar -cvf {目标文件名} {(多个)文件名或目录}将一组文件打包到一个文件中。
| 选项 | 意义 |
|---|---|
-c | 创建存档文件 |
-v | 显示打包文件信息,列出里面都有些什么 |
-f | 指定生成的存档的文件名 |
查看打包文件
使用tar -tvf {文件名}查看包中文件的信息。
| 选项 | 意义 |
|---|---|
-t | 列出存档中的内容 |
-v | 显示打包文件的详细信息 |
-f | 指定存档的文件名 |
解包
使用tar -xvf {文件名}解包。
| 选项 | 意义 |
|---|---|
-x | 还原被打包文件 |
-v | 显示打包文件的信息 |
-f | 指定存档的文件名 |
使用tar -xvf {文件名} {特定文件名}可以只解出包中特定的那个文件,并将其信息显示出来。
压缩与解压缩
如果同时打包并压缩,可以用-z、-Z、-j选项配合上面的命令一起使用。
tar -cvzf {filename.tar.gz} {files}:打包压缩tar -xvzf {filename.tar.gz}:解压缩并解包
gzip和gunzip也可以进行压缩或解压,但是往往使用tar命令一次完成压缩或解压。
任务管理
at命令
用于在指定时间执行一个或一组命令:
1 | |
| 选项 | 意义 |
|---|---|
-l | 列出所有at命令提交的作业 |
-m | 作业完成时向用户发送一条确认信息 |
-r | 从调度作业中删除指定的作业号 |
crontab命令
配置用户自己的定时任务,语法为crontab [-u 用户名] file(将制定文件中的任务加载到crontab中)或crontab [-u 用户名] {-l | -r | -e}。
| 选项 | 意义 |
|---|---|
-l | 列出定时任务的详细内容 |
-r | 删除用户的定时任务 |
-e | 编辑用户的定时任务 |
-u | 设定用户的定时任务 |
crontab可以设置周期性执行的任务,语法为f1 f2 f3 f4 f5 command。
| 参数 | 意义 |
|---|---|
f1 | 分钟(0 ~ 59) |
f2 | 小时(0 ~ 23) |
f3 | 日期(1 ~ 31) |
f4 | 月份(1 ~ 12) |
f5 | 星期几(0 ~ 6),0代表星期天 |
command | 需要执行的命令或脚本文件 |
用户管理
用户分为根账户、系统账户、普通用户账户。
- 根用户:
root,不受约束的控制系统 - 系统账户:对系统特定组件进行操作的用户
- 普通用户账户:提供对系统的交互性访问,对关键的系统文件和目录访问权限有限
组
组是具有相同特性的用户的集合,是对用户进行资源分配的一种方式,按照性质划分为系统组和私有组。
组长好不能登录计算机,设置的目的仅仅是便于权限的统一组织和分配。
账号配置文件
etc/passwd保存用户账户信息etc/shadow保存用户密码信息etc/group保存组账户信息
etc/passwd文件root用户可读可写,其他用户可读,每行一个记录,每个记录7个字段,用冒号分隔:
1 | |
useradd命令可以创建用户账户。
| 选项 | 意义 |
|---|---|
-u | 指定用户号 |
-g | 指定默认组 |
-s | 指定默认shell |
usermod命令可以修改用户账户。
userdel命令可以删除用户账户。
身份切换
su命令可以切换身份:su [-](同时切换到新工作环境) [用户名]。
平级升级切换需要输入密码。