Linux基础工具

news2024/11/17 17:32:45

💓博主个人主页:不是笨小孩👀
⏩专栏分类:数据结构与算法👀 C++👀 刷题专栏👀 C语言👀
🚚代码仓库:笨小孩的代码库👀
⏩社区:不是笨小孩👀
🌹欢迎大家三连关注,一起学习,一起进步!!💓

常用工具

  • Linux软件包管理器 yum
  • Linux编辑器vim
  • Linux编译器gcc和g++
  • Linux调试器gdb
  • make和Makefile
  • 项目的清理

Linux软件包管理器 yum

什么是软件包?

  1. 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.
    但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.
  2. 软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系.
  3. yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora,RedHat, Centos等发行版上.

通过 yum list 命令可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我们需要使用 grep 命令只筛选出我们关注的包.

在这里插入图片描述

如何安装软件呢?
我们可以通过**sudo yum install …**来安装软件。

安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成.
yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外
一个软件, yum会报错.

如何卸载软件呢?
可以通过sudo yum remove … 来卸载软件。

Linux编辑器vim

vim的三种模式(其实有好多模式,主要是这三种),分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode)。

  1. 命令模式

控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。

  1. 插入模式

只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。可以使用a、i、o进入插入模式,Esc返回命令模式。

  1. 底行模式

文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。

vim基本操作

我们可以使用vim + 文件名 进入vim。进入vim之后,是处于命令模式。

退出vim及保存文件,在命令模式下,进入底行模式。

w (保存当前文件)
wq (输入「wq」,存盘并退出vim)
q! (输入q!,不存盘强制退出vim)

命令模式命令集

1. 移动光标

vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、
「l」,分别控制光标左、下、上、右移一格
按「G」:移动到文章的最后
按「 $ 」:移动到光标所在行的“行尾”
按「^」:移动到光标所在行的“行首”
按「w」:光标跳到下个字的开头
按「e」:光标跳到下个字的字尾
按「b」:光标回到上个字的开头
按「#l」:光标移到该行的第#个位置,如:5l,56l
按[gg]:进入到文本开始
按[shift+g]:进入文本末端
按「ctrl」+「b」:屏幕往“后”移动一页
按「ctrl」+「f」:屏幕往“前”移动一页
按「ctrl」+「u」:屏幕往“后”移动半页
按「ctrl」+「d」:屏幕往“前”移动半页

2. 删除文字

「x」:每按一次,删除光标所在位置的一个字符
「#x」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符
「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符
「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符
「dd」:删除光标所在行
「#dd」:从光标所在行开始删除#行

3. 复制

「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「#yw」:复制#个字到缓冲区
「yy」:复制光标所在行到缓冲区。
「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。

4. 替换

「r」:替换光标所在处的字符。
「R」:替换光标所到之处的字符,直到按下「ESC」键为止。

5. 撤销上一次操作

「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。
「ctrl + r」: 撤销的恢复

6. 更改

「cw」:更改光标所在处的字到字尾处
「c#w」:例如,「c3w」表示更改3个字

7. 跳至指定行

「ctrl」+「g」列出光标所在行的行号。
「#G」:例如,「15G」,表示移动光标至文章的第15行行首。

底行模式命令集

1. 列出行号

「set nu」: 输入「set nu」后,会在文件中的每一行前面列出行号。

2. 跳到文件某一行

「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。

3. 查找字符

「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。(从前往后)
「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。(从后往前)

Linux编译器gcc和g++

gcc [选项] 要编译的文件 [选项] [目标文件]。

我们平时写的代码都是文本文件,计算机并不认识,需要经过编译器翻译成二进制也就是可执行程序,才能被计算机执行,而翻译这个过程有4个步骤,分别是,预处理、编译、汇编、链接。

1. 预处理

预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

2. 编译

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例: gcc –S hello.i –o hello.s

3. 汇编

汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc –c hello.s –o hello.o

  1. 链接

在成功编译之后,就进入了链接阶段。将我们形成的目标文件和库链接。

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?

系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。

库一般分为静态库和动态库。

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。
gcc在编译时默认使用动态库。

gcc选项

-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S 编译到汇编语言不进行汇编和链接
-c 编译到目标代码
-o 文件输出到 文件
-static 此选项对生成的文件采用静态链接
-g 生成调试信息。GNU 调试器可利用该信息。

Linux调试器gdb

  1. 程序的发布方式有两种,debug模式和release模式
  2. Linux gcc/g++出来的二进制程序,默认是release模式
  3. 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

常用指令

list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
list/l 函数名:列出某个函数的源代码。
r或run:运行程序。
n 或 next:单条执行。
s或step:进入函数调用
break(b) 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
info break :查看断点信息。
finish:执行到当前函数返回,然后挺下来等待命令
print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量:打印变量值。
set var:修改变量的值
continue(或c):从当前位置开始连续而非单步执行程序
run(或r):从开始连续而非单步执行程序
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
disable breakpoints:禁用断点
enable breakpoints:启用断点
info(或i) breakpoints:参看当前设置了哪些断点
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
until X行号:跳至X行
breaktrace(或bt):查看各级函数调用及参数
info(i) locals:查看当前栈帧局部变量的值
quit:退出gdb

make和Makefile

make和Makefile是Linux项目自动化构建工具。

会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

在这里插入图片描述
如图就是Make的最简单的一种写法,我们输入make指令就会对代码进行编译。
mybin就是我们要生成的可执行程序,它的依赖关系就是test.c,依赖方法就是 gcc test.c -o mybin。PHONY就是表示它的依赖关系每一次都会被执行,什么意思呢?

就是说编译代码的工作量是很大的,如果代码没有更改的前提下是不用重新编译的,就算重新make,系统会出手阻止的。

在这里插入图片描述
那么话又说回来,系统怎么知道代码有没有更新呢?

我们知道文件=内容+属性 ,文件属性有个东西叫做修改时间,通过比较文件的修改时间和可执行程序的创建时间就可以知道代码是否被更新。我们可以通过stat + 文件名 来获得文件的各种时间。

在这里插入图片描述

图中有三个时间,Access表示文件创建的时间,Modify和Change都是文件修改时间,不过Midify是文件内容的修改时间,Change是文件属性的修改时间。我们也经常把时间叫做ACM时间。通过比较两个文件的Modify时间就可以知道是否需要重新make。

Makefile的语法也支持变量的写法。

在这里插入图片描述
对于多文件同时编译,使用变量的方法比较好。

原理:

make是如何工作的,在默认的方式下,也就是我们只输入make命令。

  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件, 并把这个文件作为最终的目标文件。
  3. 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件新(可 以用 touch 测试),那么,他就会执行后面所定义的命令来生成hello这个文件。
  4. 如果hello所依赖的hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果 找到则再根据那一个规则生成hello.o文件。(这有点像一个堆栈的过程)
  5. 当然,你的C文件和H文件是存在的啦,于是make会生成 hello.o 文件,然后再用 hello.o 文件声明 make的终极任务,也就是执行文件hello了。
  6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文 件。
  7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错, 而对于所定义的命令的错误,或是编译不成功,make根本不理。
  8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。

项目的清理

工程是需要被清理的。 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行。不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。

那么今天的分享就到这里了,有什么不懂得可以私信博主,或者添加博主的微信,欢迎交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1066669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【轻松玩转MacOS】基本操作篇

引言 本文是系列的开篇,我将为大家介绍MacOS的基本操作。对于初次接触MacOS的用户来说,掌握这些基本操作是必不可少的。无论是启动和关机,还是使用键盘和鼠标,或者是快捷键的使用,这些基本操作都是你开始使用MacOS的第…

三星发布 Galaxy SmartTag 2

三星近日发布了一款新品 —— Galaxy SmartTag 2 追踪器,该款产品采用了全新的椭圆设计以取代上代 SmartTag 的菱形设计,这款的钥匙孔也比上代更大,并采用了金属圆环以防止磨损。 这款产品有黑、白2种颜色可供选择,支持 IP67 级防…

网络原理 - 详解

一,网络通信基础 1.1 IP地址 描述一个设备在网络上的地址,一般使用4个0~255之间的数字,并且使用三给 . 进行分割,如:127.0.0.0 1.2 端口号 端口号是一个2个字节的整数,用来区分一个主机上的不同应用程序…

全面解析HTTP协议

当谈到网络通信和Web开发时,HTTP(Hypertext Transfer Protocol)是一个非常重要的协议,它是用于在Web浏览器和服务器之间传输数据的基础协议。 什么是HTTP协议? HTTP是一种应用层协议,用于在客户端和服务器…

吸烟检测Y8N,支持C++,PYTHON,ANDROID

吸烟检测Y8N,支持C,PYTHON,ANDROID 现在,深度学习已经非常流行,最新出来的YOLOV8,更是将精度和速度达到极限。训练一个目标很简单,首先,标记图片;然后训练得到PT模型;最后转换成ONNX…

烟花爆竹厂如何做到0风险0爆炸事故?AI+视频监控平台给出答案

由于烟花爆竹具有易燃易爆风险,稍有不慎就会发生严重事故,而烟花爆竹厂区作为大量烟花爆竹存放地点,厂区面积大、工作人员杂乱,甚至有很多厂区原料存放不当,给日常的安全管理带来极大的压力,利用信息化手段…

掌动智能:性能压力测试的重要性

采用性能压力测试可以帮助企业预估系统容量、提升用户体验以及降低风险和成本。在软件开发过程中,将性能压力测试纳入测试策略的重要一环,将为企业的成功和用户满意度打下坚实的基础。 性能压力测试的重要性: 一、发现性能瓶颈 性能压力测试能…

【Linux】信号屏蔽与信号捕捉的原理与实现(附图解与代码)

这一篇的篇幅可能有点长,如果已经了解了以下两个知识点的同学可以自行跳到第三部分——信号屏蔽的实现。 不太了解的同学希望你们能够静下心来看完,相信一定会有不小的收获。那么话不多说,我们这就开始啦!!&#xff0…

企业防止泄密,应该做到哪些?(防止数据泄露的方法有哪些)

随着信息化时代的快速发展,信息泄露问题越来越普遍。一个数据泄露事件就可能导致企业巨额损失,甚至影响用户的安全和隐私。因此,如何防止失泄密问题的发生是企业和个人都需要重视的事情。下面介绍一些具体的方法和措施来防止失泄密问题发生。…

FR问题记录

1. 问题:下拉框搜索查询时,出现所有的搜索信息 解决方法:使用数据集sql进行数据筛选 在数据库查询中使用where条件筛选,如 ${IF(LEN(所属省份) 0,"","AND province in (" 所属省份 ")")}参考…

百度统计统计第三方网站的浏览量和访问量

百度统计简介 百度统计——领先的中文网站分析平台 百度统计是百度推出的一款免费的专业网站流量分析工具,能够告诉用户访客是如何找到并浏览用户的网站,在网站上做了些什么,有了这些信息,可以帮助用户改善访客在用户的网站上的…

【单调栈】下一个更大元素 I

文章目录 Tag题目来源题目解读解题思路方法一:暴力枚举方法二:单调栈哈希表 知识回顾单调栈 写在最后 Tag 【单调栈哈希表】【数组】 题目来源 496. 下一个更大元素 I 题目解读 找出 nums1 中数字 x 在 nums2 中的位置,并找出在 nums2 中比…

【SpringBoot】文件分片上传、合并

背景 在上传大型文件时,一般采用的都是分片、断点续传等技术,这样不会导致因文件过大而造成系统超时或者过压等情况。 接下来我们进入教学 如果有帮助到您,麻烦请点击个收藏、赞,谢谢~ 一、实际效果图 整个前端网页的效果图&…

商城小程序代客下单程序开发演示

一款专为传统电商、实体商家开发的商城系统小程序,做私域、做留存、做社交必备功能全都有。 1、丰富的营销玩法:拼团、秒杀、定金预售、分销、社区团购、积分商城、支付有礼等主流获客玩法都有。 2、强大的会员体系:普通会员、付费会员、会…

spring 事务源码阅读

开启事务 使用EnableTransactionManagement注解开启事务 该注解会引入TransactionManagementConfigurationSelector类,然后该类导入两个类AutoProxyRegistrar和ProxyTransactionManagementConfiguration。 1、添加bean后置处理器 AutoProxyRegistrar类的作用是注…

883. 高斯消元解线性方程组

883. 高斯消元解线性方程组 - AcWing题库 输入一个包含 n 个方程 n 个未知数的线性方程组。 方程组中的系数为实数。 求解这个方程组。 下图为一个包含 m 个方程 n 个未知数的线性方程组示例: 输入格式 第一行包含整数 n。 接下来 n 行,每行包含 n1…

千万不要支付赎金!解密.halo勒索病毒的秘诀在这里

导言: .halo 勒索病毒等勒索病毒已经成为网络犯罪分子的利器,威胁着很多企业的数据安全。本文91数据恢复将为您介绍 .halo 勒索病毒的新面貌,以及一些创新的方法,如何保护和恢复被 .halo 勒索病毒加密的数据文件,并提供…

【计算机视觉|人脸建模】学习从图像中回归3D面部形状和表情而无需3D监督

本系列博文为深度学习/计算机视觉论文笔记,转载请注明出处 标题:Learning to Regress 3D Face Shape and Expression from an Image without 3D Supervision 链接:[1905.06817] Learning to Regress 3D Face Shape and Expression from an I…

6-10 单链表分段逆转 分数 15

void K_Reverse( List L, int K ) { //此题已经默认size > K 因为当size < K时 反转后将不再符合链表的定义//求出表中元素个数int size 0;for (List cur L->Next; cur ! NULL; cur cur->Next)size; List prv, cur, next, first, head L;//共需要反转 si…

功率放大器可以放大电压吗为什么

功率放大器是一种电子设备&#xff0c;用于将输入信号的功率放大到更高的水平。而电压是功率的一个组成部分&#xff0c;所以功率放大器可以放大电压。 在功率放大器中&#xff0c;输入信号经过放大器的放大阶段后&#xff0c;会得到一个更强的输出信号。这个放大过程是通过增加…