Linux八股文
第一章 Linux简介
Linux是一种多用户、多任务,支持多线程和多CPU的操作系统,具有免费、稳定、高效的优点,一般运行在大型服务器上。
1.1 常用目录
目录 | 说明 |
---|---|
/ | 根目录,有且仅有一个,一般只存放目录 |
/home | 家目录,新增用户时,放在此目录下 |
/root | 系统管理员root的家目录 |
/bin/user/bin | 可执行二进制文件的目录 |
/etc | 系统配置文件存放的目录 |
/media | 光盘默认挂载点 |
/tmp | 一般用户或正在执行的程序临时存放文件的目录 |
/var | 存放不断扩充的东西,经常被修改的目录存放在此,包括日志文件 |
1.2 [root@localhost ~]#
- @之前是当前登录用户
- localhost是主机名(即开发机的名字)
- ~当前所在目录(此时为家目录,而/是根目录)
- #是用户表示(#为超级用户,$是普通用户)
1.3 Linux命令写法
shell
命令名 [选项] [参数]
- 命令名:功能的单词或缩写
- 选项:对命令进行控制,可以省略;格式为
-字母
、-单词
、字母
,并且可以合并(如-a
、-b
可以合并为-ab
) - 参数:传给命令的参数,可以是0个、1个或多个
第二章 Linux基础命令
2.1 pwd
功能:显示当前用户所在目录
shell
pwd
2.2 ls
功能:
-
对于目录:ls将列出该目录下所有子目录与文件
-
对于文件:ls将列出文件名及其他信息
ls [选项] [目录或文件]
选项 | 说明 |
---|---|
-a | 查看当前目录下的文件,包括隐藏文件 |
-l | 长格式显示文件 |
-lh | 以方便阅读的长格式显示 |
2.3 cd
功能:改变工作目录,将当前工作目录改变到指定目录下
shell
cd [目录名]
命令 | 说明 |
---|---|
cd .. |
返回上一级目录 |
cd ../.. |
返回上两级目录 |
cd ~ |
返回家目录 |
cd / |
切换根目录 |
cd /home/chaopro/data |
绝对路径 |
cd ./data |
相对路径 |
2.4 man
功能:连机查找指令用法
shell
man 指令
2.5 grep
功能:用于查找文件里符合条件的字符串
shell
grep [选项] '字符串' 文件名
选项 | 说明 |
---|---|
-a | 将binaray文件以text文件的方式查找数据 |
-c | 计算找到'查找字符串' 的次数 |
-i | 忽略大小写 |
-v | 反向选择,即显示出没有'查找字符串' 的行 |
2.6 find
功能:在指定目录下查找文件
shell
find [路径] [选项]
选项 | 说明 |
---|---|
-name test | 查询名为text的文件 |
-size +100k | 文件大于100k的文件 |
-ctime n | 过去n天被修改过的文件 |
2.7 chmod
功能:控制用户对文件的权限
shell
chmod [选项] 文件名
选项 | 说明 |
---|---|
-r | 赋予读权限 |
-w | 赋予写权限 |
-x | 赋予执行权限 |
777 | 赋予读、写、执行权限(读:4,写:2,执行:1) |
说明:(以-rw-r--r-x
的权限为645为例)
- 权限显示位共10位,分为4段,从第2位开始,每3个一组
- 第1位为文件类型(
-
表示普通文件) - 第2-4位为用户权限(
rw-
:4+2=6) - 第5-7位为用户所属组权限(
r--
:4) - 第8-10位为其他用户权限(
r-x
:4+1=5)
2.8 ps
功能:用来列出当前正在运行的进程
shell
ps [选项]
选项 | 说明 |
---|---|
-A | 列出所有进程(!) |
-ef | 查看全格式的所有进程(!) |
-w | 显示加宽可以显示较多资讯 |
-au | 显示较详细的咨询 |
-aux | 显示所有包含其他使用者的进程 |
2.9 kill
功能:用于删除执行中的程序或工作
shell
kill [选项]/[信号] 进程号
选项 | 说明 |
---|---|
-l | 列出全部的信息名称 |
-s | 指定要送出的信息 |
信号 | 说明 |
---|---|
-1(HUP) | 重新加载进程 |
-9(KILL) | 杀死进程 |
-15(TERM) | 正常停止一个进程 |
2.10 tail
功能:查看测试项目的日志:一般测试项目中有log目录文件会存放xxx.out文件,可以用tail -f动态实时查看日志
shell
tail [选项] 文件名
选项 | 说明 |
---|---|
-f | 实时读取 |
-1000 | 查看最近1000行日志 |
例子
shell
tail -f /opt/usr/log/momenta/mff_main_node.log.(⾃动补全Tab键) | grep -i objectdisp
2.11 netstat命令
功能:查看端口
shell
netstat -anp | grep 端口
-a,显示所有
-n,不用别名显示,只用数字显示
-p,显示进程号和进程名
2.12 data
功能: 查看当前系统时间
shell
data
2.13 ping
功能:检测是否与主机连通
shell
ping ip地址
2.14 如何查未知命令
shell
man 命令名
命令 -help
info cat 命令名
whatis 命令名
上网查
第三章 文件操作命令
3.1 mkdir
功能:创建空目录
shell
mkdir [选项] [路径] 文件名
选项 | 说明 |
---|---|
-p | 层级创建 |
-v | 显示创建顺序 |
3.2 rmdir
功能:删除空目录,但不能删除非空目录,也不能删除文件
shell
rmdir [选项] [路径] 目录名
选项 | 说明 |
---|---|
-p | 子目录被删除后,如果父目录也变成空目录的话就连带父目录删除 |
3.3 touch
功能:新建空文件
shell
touch [路径] 文件名
3.4 rm
功能:删除文件或目录
shell
rm [选项] 文件名
选项 | 说明 |
---|---|
-f | 强制删除 |
-r | 多级删除 |
-rf | 强制删除给定目录下所有文件和目录 |
rm和rmdir的区别:
- rmdir只能删除空目录,不能删除文件
- rm带上选项-r可以删除非空目录
3.5 mv
功能:移动文件
shell
mv [选项] [路径] 旧文件名 [新路径] [新文件名]
选项 | 说明 |
---|---|
-f | 如果目标文件已存在,不会询问直接覆盖 |
-i | 如果目标文件存在,会询问是否覆盖 |
3.6 cp
功能:复制文件或目录
shell
cp [选项] [路径] 旧文件名 [新路径] [新文件名]
选项 | 说明 |
---|---|
-f或--force | 强制复制,无论目标文件或目录是否存在 |
-i或--interactive | 覆盖前会询问 |
-r | 递归处理,将指定目录下的文件与子目录一并处理,若源文件或目录的形态不属于目录或符号连接,则一律视为普通文件处理 |
-R或--recursive | 递归处理,将指定目录下的文件与子目录一并处理 |
3.7 cat
功能:查看目标文件的内容
shell
cat [选项] 文件名
选项 | 说明 |
---|---|
-b | 对非空输出行编号 |
-n | 对输出的所有行编号 |
-s | 不输出多行空行 |
3.8 tar
选项 | 说明 |
---|---|
-c | --create 建立新的备份文件; |
-C | --directory= 切换到指定的目录; |
-f | --file= 指定备份文件(注意:-f 是最后的参数,只能接文件名); |
-r | --append 新增文件到已存在的备份文件的结尾部分; |
-u | --update 仅置换较备份文件内的文件更新的文件; |
-v | --verbose 显示指令执行过程; |
-x | --extract或--get 从备份文件中还原文件; |
-z | --gzip或--ungzip 通过gzip指令处理备份文件; |
shell
tar -xvf file.tar //解压 tar包
tar -xzvf file.tar.gz //解压tar.gz
tar -xjvf file.tar.bz2 //解压 tar.bz2
tar -xZvf file.tar.Z //解压tar.Z
unrar e file.rar //解压rar
unzip file.zip //解压zip
第四章 vim使用教程
4.1 vim三种模式
- 命令模式:删除、复制、粘贴
- 编辑模式:编辑文本内容
- 末行模式:保存、退出
4.2 vim三种打开方式
shell
// 1.常规打开:vim ⽂件路径
vim mff_config.json
// 2.打开时定位到指定行:vim +行数 文件路径
vim +3 mff_config.json
// 3.打开时⾼亮关键词:vim +/关键词 文件路径
vim +/is_hnp_switch_ignore mff_config.json
4.3 命令模式
打开文件后默认即为命令模式,从其他模式切换回命令模式按Esc
1、移动光标(光标高亮部分表示位于前⼀个字符的后面)
操作 | 说明 |
---|---|
h或← | 光标左移1个单位 |
l或→ | 光标右移1个单位 |
k或↑ | 光标上移1个单位 |
j或↓ | 光标下移1个单位 |
shift+6 | 光标移动到行首 |
shift+4 | 光标移动到行尾 |
gg | 光标移动到首行头 |
G | 光标移动到尾行头 |
2、搜索替换
操作 | 说明 |
---|---|
/字符串+回车 | 向下搜索指定字符串 |
n | 继续向下搜索 |
?字符串+回车 | 向上搜索指定字符串 |
N | 继续向上搜索 |
:%s/word1/word2/g | 将文件中的word1替换成word2 |
:%s/word1/word2/gc | 将文件中的word1替换成word2,需要用户确认 |
3、删除复制粘贴
操作 | 说明 |
---|---|
x | 删除后⼀个字符 |
X | 删除前⼀个字符 |
dd | 剪切一行 |
yy | 复制一行 |
p | 粘贴到下一行 |
P | 粘贴到上一行 |
u | 撤回 |
4.4 编辑模式
操作 | 说明 |
---|---|
i | 输⼊模式,左下角显示‒INSTER‒ |
o | 在光标下插一行并进入输入模式,左下角显示‒INSTER‒ |
R | 取代模式,输入的值会取代光标所在的内容 |
4.5 末行模式
操作 | 说明 |
---|---|
:w | 保存 |
:q | 退出 |
:wq | 保存并退出 |
:q! | 不保存强制退出 |
:set nu | 显示行号 |
:set nonu | 不显示行号 |
:w 文件名 | 将编辑后的内容保存到另⼀个文件中 |
第五章 GCC/G++编译和GDB调试
5.1 gcc和g++误区
两者都为GNU编译器
-
误区一:gcc只能编译c,g++只能编译c++
-
后缀为.c的,gcc视为c程序,而g++视为c++程序
-
后缀为.cpp的,gcc和g++都视为c++程序
-
在编译阶段,gcc命令不能自动和c++程序使用的库链接,通常用g++来完成链接,故为了统一就用g++了
-
-
误区二:gcc不会定
__cpluscplus
宏,而g++会- 如果后缀是.c且用gcc编译则宏是未定义的,其余情况都是定义的(即后缀为.cpp用gcc编译会定义该宏)
-
误区三:编译只能用gcc,链接只能用g++
- 实际上编译可以用gcc/g++,链接可以用g++或者gcc -lstdc++
5.2 编译指令
shell
gcc test.c -E -o test.i // 该操作为预处理,即将源文件的头文件展开,通过-E进行预处理,其中-o是命名操作
gcc test.i -S -o test.s // 该操作为编译,即将预处理后的源代码变成汇编,通过-S进行编译
gcc test.s -C -o test.o // 该操作为汇编,即将汇编代码变为机器码(0、1)
gcc test.c // 直接获得最后的out文件,其实经历了上面三个步骤。默认生成的文件名为a.out
./a.out // 运行该out程序
5.3 Makefile
-
Makefile的特点
-
Makefile文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译 ,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 Makefile 文件就像一个 Shell 脚本一样,也可以执行操作系统的命令
-
Makefile文件一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
-
-
命名
- 文件命名为
makefile
或Makefile
,使用vim打开上述文件并进行编辑(注意不用新建这个文件,直接vim即可)
shellvim Makefile
- 文件命名为
-
书写方法
- 常规编写方法与案例(编写完成并保存后,在shell中输入
make
就可以运行Makefile文件)
shell
目标:依赖
命令
app:sub.c add.c mult.c div.c main.c
gcc sub.c add.c mult.c div.c main.c -o app
- 如果依赖存在则执行;如果不存在,则向下检查其他规则,检查有没有规则是用来形成依赖的,如果找到了则执行(如下代码)。
- Makefile中的其它规则一般都是为第一条规则服务的,make默认执行第一条规则,如果下面的规则和第一条规则无关则不会执行
shell
app:sub.o add.o mult.o div.o main.o
gcc sub.o add.o mult.o div.o main.o -o app
sub.o:sub.c
gcc -c sub.c -o sub.o
add.o:add.c
gcc -c add.c -o add.o
mult.o:mult.c
gcc -c mult.c -o mult.o
div.o:div.c
gcc -c div.c -o div.o
main.o:main.c
gcc -c main.c -o main.o
-
变量的使用
-
%
是通配符,匹配一个字符串,例如: -
自定义变量:变量名=变量值,例如
var=hello
-
预定义变量(已经定义好了)
-
变量名 | 变量值 |
---|---|
CC | gcc |
CXX | g++ |
shell
#定义变量
src=sub.o add.o mult.o div.o main.o
target=app
$(target):$(src)
$(CC) $(src) -o $(target)
sub.o:sub.c
gcc -c sub.c -o sub.o
add.o:add.c
gcc -c add.c -o add.o
mult.o:mult.c
gcc -c mult.c -o mult.o
div.o:div.c
gcc -c div.c -o div.o
main.o:main.c
gcc -c main.c -o main.o
5.4 GDB调试
- 调试前
- 编译时一定要打开调试选项(
-g
),其作用是在可执行文件中加入源代码的信息 ,比如可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证 gdb 能找到源文件(即源文件与可执行文件在一个文件夹下)
shell
gcc -g program.c -o program
- 启动、退出、查看代码
- 启动:
gdb 可执行程序
,退出:quit/q
- 给程序设置参数:
set args 10 20
, 获取设置参数:show args
- 查看当前文件代码:
list
(按enter默认执行上一条命令)
shell
list/l (默认位置即从main函数的第1行显示到第10行)
list/l 行号 (该行号显示在正中间)
list/l 函数名 (该函数显示在中间)
- 查看其他文件代码
shell
list/l 文件名:行号
list/l 文件名:函数名
- 查看/设置list行数
shell
show list/listsize
set list/listszie 行数
- 断点操作
- 设置断点(将断点设置在这一行的开始,即程序走到这里,该还还未执行)
shell
break/b 行号
break/b 函数名
break/b 文件名:行号
break/b 文件名:函数名
- 查看断点信息
shell
info/i break/b
- 删除断点
shell
delete/del/d 断点编号,编号在断点信息的Num字段
- 设置断点无效/有效
shell
disable 断点编号,这条命令可从查看断点信息的Enb字段查看
enable 断点编号
- 设置条件断点(一般是循环位置)
shell
break/b 10 if i==5,即在第10行加条件断点
- 调试命令
- 运行
shell
start 程序会停在第一行,不会继续执行
run 遇到断点才停,如果没有断点则一次性执行完,经常使用run而非start
- 继续运行,直到下一个断点
shell
c/continue
- 向下执行一行(不会进入函数体)
shell
n/next
- 变量操作
shell
p/print 变量名(打印变量值)
ptype 变量名(打印变量类型)
- 向下单步调试(遇到函数进入函数体)
shell
s/step(不同于n)
finish(跳出函数体,前提是函数体中无断点)
until (跳出循环,前提是循环中无断点)
- 自动变量设置
shell
display 变量名(自动打印指定变量的值)
i/info display 查看自己设置的自动变量
undisplay 编号,删除自动变量