Linux的常用操作
Linux教程:https://subingwen.cn/linux/
1.简单终端操作
(1)在终端中可以使用tab键来进行自动补全
(2)ctrl shift + 可以放大终端
2.相对路径和绝对路径
(1)cd Lab1 表示进入当前文件下的Lab1文件夹
(2)cd .. 表示进入上一级目录
(.表示当前目录 , ..表示当前目录的上一级目录)
(3)cd ~ 表示切换到home目录下的当前用户目录
(home目录下可以存储多个用户目录,如果这个电脑注册了多个用户)
(4)pwd展示当前所在位置的路径
(5)ls表示list即列出当前目录下的文件和目录
(6)ll表示罗列出当前文件、目录的详情信息,如时间、大小等信息
3.创建目录
mkdir 表示make direction即创建一个目录(文件夹)
mkdir aaa 在当前目录下创建一个名为aaa的目
mkdir /usr/aaa 在指定目录下创建一个名为aaa的目录
mkdir -p a/b/c 加上参数-p,在当前目录下创建多层目录
4.vim hello.c 表示用vim在当前位置打开hello.c这个文件,如果没有则创建
5.gcc hello.c表示编译这个.c文件
默认的.c文件编译链接后文件名是a.out
gcc后加-o可以命名可执行程序,如gcc hello.c -o hello
6.运行可执行程序
./hello表示运行刚刚编译通过的可执行文件
./a.out 若生成的可执行程序未人工命名,系统会默认为a.out
7.罗列文件信息
9.查找文件
wheris stdio.h查找文件所在位置
10.删除文件、目录
rm表示remove(移除、删除)
rm a.out 表示删除当前目录下的a.out文件
rm -r testfan 加上-r表示递归操作,删除testfan目录
11.拷贝
(1)文件拷贝
语法: cp 要拷贝的文件A 得到的文件B
如果B不存在则创建B文件,如果B存在那么原来的B文件将被覆盖
(2)目录拷贝
拷贝目录需要参数-r表示递归
A是需要被拷贝的目录
场景1:B目录原来不存在,通过拷贝创建出目录B
$ cp 目录A 目录B -r
场景2: 目录B原来存在, 执行下边的拷贝 ==> 目录A会被拷贝并被放到目录B中
$ cp 目录A 目录B -r
场景3: 把A目录里的一个或者多个文件拷贝到B目录中
# 拷贝 A目录中的 a.txt 到目录B中
$ cp A/a.txt B
# 拷贝 A目录中的所有文件(*表示所有)到目录B中。不能确定A中是否有子目录, 因此需要加-r
$ cp A/* B -r
12.mv命令
mv就是move,这个命令可以对文件、目录进行移动,也可以改名
(1)移动文件、目录
move A B
A可以是文件或目录,B是一个存在的目录
这个命令表示把A移动到B
(2)改名文件、目录、
move A B
A是文件或目录 B是一个不存在的新名字
如move English.txt eng.txt 表示把English.txt改名为eng.txt
(3)文件覆盖
move A B
A和B必须都是已经存在的文件,不能是目录!!!
A文件中的内容覆盖B文件中的内容, A文件被删除, 只剩下B文件
13.查看文件
(1)more
$ more 文件名
# 快捷键
- 回车: 显示下一行
- 空格: 向下滚动一屏
- b: 返回上一屏
- q: 退出more
(2)cat
cat 加文件名
适合看比较小型的文件
(3)head/tail
head -20 文件名 查看文件的前20行
tail -30 文件名 查看文件的后30行
14.压缩和解压缩
(1)使用tar压缩文件:
tar zcvf all.tar.gz *
参数解释:
tar是一种打包工具,可以把文件打包,但不会压缩
c: 创建压缩文件
z: 使用 gzip 的方式进行文件压缩
j: 使用 bzip2 的方式进行文件压缩
(z和j是互斥的,只能选取一个压缩工具进行当前的压缩操作)
v: 压缩过程中显示压缩信息,可以省略不写
f: 指定压缩包的名字
上面的指令指定为all.tar.gz,使用gzip进行压缩后缀名需要加上.gz
(2)使用tar解压缩文件
tar zxvf all.tar.gz -C temp
参数解释:
x: 释放压缩文件内容,也就是解压
z: 使用 gzip 的方式进行文件压缩,压缩包后缀为.tar.gz
j: 使用 bzip2 的方式进行文件压缩,压缩包后缀为.tar.bz2
v: 解压缩过程中显示解压缩信息
f: 指定压缩包的名字
-c :指定解压目录
15.gcc 参数
(1)-c (compile)只编译生成中间同名目标文件,也就是.o文件,不链接
(2)-o (output)指定生成文件名字,不加-o会默认生成a.out
(3)-g 可以通过gdb进行调试
(4)-l 在程序编译的时候,指定使用的库
(5)-L 指定编译的时候,搜索的库的路径。
(6)-I 指定头文件所在的目录
(7)-fPIC/fpic 生成与位置无关的代码
(8)-shared 生成共享目标文件。通常用于建立共享库时
(9) -D 在程序编译的时候,指定一个宏,例如可以在编译的时候定义Debug这个宏,这样就不需要在代码里面定义Debug
gcc与g++的异同
(1)gcc, g++ 都可以编译C程序,编译程序的规则和参数都相同
(2)g++可以直接编译C++程序,gcc 编译C++程序需要添加额外参数-lstdc++
(3)gcc ,g++ 都可以定义 __cplusplus 宏
16.Makefile
(1)作用
Makefile文件相当于把需要执行的gcc命令放到Makefile文件中
这样不需要重复地在命令行执行gcc命令,直接在命令行写make就可以了
在命令行输入make clean 可以删除Makefile中clean操作指定的文件(一般是.o文件和可执行程序等)
(2)
先编写链接依赖关系,再编写编译依赖关系
如下图:
(3)定义变量
# 普通写法
calc:add.o div.o main.o
gcc add.o div.o main.o -o calc
# 使用自定义变量写法
# 定义obj变量
obj=add.o div.o main.o
# 定义target变量
target=calc
#$表示取出变量的值
$(target):$(obj)
gcc $(obj) -o $(target)
17.静态库和动态库
视频教程:
18.gdb调试
19.gdb的使用
gdb bomb 调试可执行程序bomb
q 退出gdb
r 执行程序,即run
l 查看c语言代码
x/10i main 查看main函数的反汇编代码
x/10i $rip rip是用来存放下一条即将用来执行的指令的地址,又称为PC
b 5 在指定位置设置断点
n 执行下一条程序指令
ni 执行下一条反汇编指令
c 继续执行,即continue
x/s 0x405780 查看指定位置的字符串(s表示字符串)
si 进入函数单步执行
info reg 查看寄存器的内容
layout asm 查看汇编代码
layout regs 查看寄存器
set args haha 设置命令行参数为haha
show args 查看命令行参数
20.edb的使用
edb –run bomb