Linux开发工具的使用
文章目录
- vim的使用
- 基本模式介绍
- 光标当前行操作(命令行模式)
- 光标快速定位(命令行模式):
- 插入模式的三种方式(命令行模式):
- vim基本操作(命令行模式)
- 底行模式的操作
- Linux编译器 - gcc/g++的使用
- Linux自动化构造工具 - make/makefile的使用
- 用法:
- make/makefile使用注意事项(基本原理):
- 总结make/makefile
- 进度条实现
- git的使用 (代码管理)
vim的使用
在Linux中我们有个vim工具,我们可以在它上面进行编写代码。同时vim有很多种模式。
基本模式介绍
这里我们主要介绍三种模式:命令行模式、插入模式、底行模式
当我们使用vim打开一个文件时候默认就是命令行模式,此时无论我们按什么键都写不进去,同时按Esc
会变为命令行模式。
当我们按i的时候,会进入插入模式,此时我们可以进行书写代码。
当我们按Esc
回到命令行模式的时候,按shift + :(冒号)
进入底行模式,按wq退出vim。同时底行模式下输入:set nu显示行号
光标当前行操作(命令行模式)
- 复制:按两下
y
- 拷贝:然后再按
p
会拷贝光标所在行的内容当指定光标出。 - n + p:拷贝n行
- 剪贴:按两下
d
,然后再按p
会拷贝光标所在行的内容当指定光标出。 - 删除:按两下
d
- 撤销:按
u
一步一步插销步骤 - 反撤销:
ctrl
+r
,退回到撤销的上一步 - x : 删除当前光标位置的字符
- n + x:删除当前位置往后n个字符,包括当前字符
shif
+x
:删除当前光标位置前一个字符- n +
shif
+x
:删除当前光标位置前n个字符,不包括当前字符
光标快速定位(命令行模式):
- 上下左右箭头,控制上下左右移动
- hjkL,也可以控制上下左右移动
shif + g
:定位到文件末尾- 按两下
g
:定位到文件开头 - n + shif + g :定位到第n行
shif + ^
:定位到当前行开头shif + $
:定位到当前行末尾b
:一个单词一个单词后前走w
:一个单词一个单词后后走
插入模式的三种方式(命令行模式):
- 输入a - 往后移动一个光标位置
- 输入i - 定位到当前位置
- 输入o - 往下空出一行并且光标移动到空行开头
vim基本操作(命令行模式)
ctrl
+f
:往下翻动一页ctrl
+b
:往上翻动一页
shift
+~
:切换大小写(小->大,大->小),同时切换之后往后移动一个字符。- n +
shift
+~
:默认往后切换n个字符的大小写。 - r :替换光标当前位置的字符
- n + r:往后替换n个字符
shift
+r
:切换为替换模式,一直往后替换,直到Esc返回命令行模式。- vim 开多窗口
当我们使用vim打开一个窗口之后,切换到底行模式之后,输入:vs + 另一个文件名就可以再开一个窗口了。按住ctrl
+ ww,光标切换到下一个窗口。
- 多行注释和取消注释
这里的j
表示向下移动光标,k
向上,h
向左,l
向右。
那么如何取消注释呢?
这里需要注意我们光标选择的部分我们如果按d
的话,都会直接删掉,所以选择的时候要注意选择注释的部分。
- sudo提权
同时学了vim之后我们可以再来弥补一下之前残留的一个问题,当我们是普通用户的时候,我们可以使用
sudo
进行短暂的提权,使我们可以使用root的权限。
但是这里一般我们不进行配置的话,普通用户使用sudo是不可以使用的,需要如下配置:
底行模式的操作
- w : 表示保存。
- q :表示退出
- wq:保存并退出
- q!:强制退出
- wq!:强制保存并退出
- / + 内容:定位文件内容,同时按n表示往下查找
Linux编译器 - gcc/g++的使用
这里以C语言文件为例,一个C语言源文件变为可执行程序经过了哪些步骤呢?这里我们有一个test.c源文件。
预处理 - 宏展开、取消注释等等
gcc -E test.c -o test.i
编译 - 生成汇编代码,进行语法检查。
gcc -S test.i -o test.s
汇编 - 把汇编代码翻译为机器代码
gcc -c test.s -o test.o
链接 - 生成可执行文件,进入链接
gcc test.o -o test
这里链接的时候就需要了解一下函数库了,在上述文件当中我们使用了printf这个库函数,那么这个库函数就在我们的函数库当中。
函数库一般分为静态库和动态库
- 动态库
在Windows系统中动态库后缀为.dll,Linux(.so),当我们使用printf的时候,我们其实存储的是printf在动态库中的地址,有了这个地址我们链接的时候直接去对应的动态库中查找即可。这样做的好处就是节省了空间,但是由于每一个库函数依赖的都是我们动态库里面的,如果动态库里面的文件损坏了,那么程序就不能运行
- 静态库
静态库则是把printf库函数的实现包了进来,这样缺点就是空间消耗大,就没有动态库那样,一个损坏其他的不能运行。
同时在Linux中有ldd命令 + 可执行程序可以查看调用了哪些动态库,Linux默认使用的是动态库。file + 可执行程序可以查看链接的时候用的是动态库还是静态库。
gcc test.c -o test -static
上述可以使用静态库。
Linux自动化构造工具 - make/makefile的使用
make:一条指令
makefile:一个文件
用法:
如上图,我们通过创建一个Makefile文件(这里的M小写也可以)和使用make指令,可以自动化帮我们执行编译与清理的工作。这就是make/makefile的作用。
来解释一下我们的Makefile:
# 这里主要是 proc 和 proc.c 的依赖关系,我们如何得到proc呢?依赖的是proc.c,那proc.c如果变为proc呢?
# 靠的是我们下面所写的依赖方法。
proc:proc.c# proc - 目标文件(可执行程序) # proc.c 生成proc所依赖的目标文件
[Tab]gcc proc.c -o proc # 依赖方法
当我们使用make指令的时候他会去Makefile文件从上往下查找,当找到第一个目标二年级四年的时候,会看后面所依赖的文件,调用依赖方法中的指令生成所需要的目标文件。
# phony有虚假的意思
# .PHONY:clean // .PHONY表示的是一种伪目标文件,而这个伪目标文件依赖的是什么呢?依赖的是clean
.PHONY:clean
# clean:clean后没有依赖目标,直接调用依赖方法中的指令即可。
clean:
[Tab] rm -f proc
取消指令回显
如上图,当我们在编译与清理过程增加指示的时候发现不仅我们的结果输出出来,而且我们的指令也跟着显示了出来。如果我们不想要显示对应的指令只需要在Makefile文件当中对应的指令前面增加@
make/makefile使用注意事项(基本原理):
如果我们把.PHONY放到文件开始会怎样呢?
如上图,我们发现当我们把**.PHONY放在文件开头的时候**,我们使用make指令,默认直接调用的是清理资源的指令,而我们的编译指令还需要我们使用make + proc才可以执行。
那么我们可以得出来第一条注意事项就是:
- make/makefile有一个缺省的执行程序,就是我们Makefile从上往下查找到的第一个目标文件,其余所需要的目标文件都要使用make + 目标文件名。
那如果我们的proc.c文件中有报错呢?
如上图我们可以得出第二条注意事项:
- 当我们make/makefile中途遇到错误的时候会直接终止程序,下面的代码不再执行
在使用make指令的时候我们发现一个问题(如下图):
我们发现当我们使用make指令之后再进行make,我们发现并不能进行编译了?这时为什么呢?
如上图,我们发现当我们使用,.PHONY修饰我们的proc的时候,此时生成可执行文件之后再使用make又可以继续进行编译了?
这里我们就要提一个概念了,我们一个文件当中,其实有三种时间:(Access)访问时间,(Modify)修改时间,(Change)改变时间
如上图可以看到,当我们对文件内容进行修改的时候,那么文件的修改时间和改变时间都发生了变化,此时我们就可以再进行编译了,之所以之前不能进行编译的原因就在于我们的时间并没有发生改变,那么编译器如何知道我们文件的时间是否改变了呢?
如上图,当我们对文件进行修改的时候,我们文件修改的时间肯定比之前可执行程序的修改时间要晚,那么当我们修改文件之后使用make指令,编译器就会对比这两个时间,如果我们源文件的时间晚于我们的可执行程序就说明发生了修改,那么此时我们就需要再次编译否则就不能进行再编译。那上述我们加了.PHONY可以再编译的原因就是.PHONY会让编译器忽略这个时间差异,每次都当做是修改了文件来处理。
所以这里我们的第三条注意事项为:
- .PHONY会让编译器忽略文件时间的差异
在我们上文提到一个源文件生成可执行程序需要进过预处理,编译,汇编,链接过程,那么我们试试使用makefile把这些步骤通过一个make指令自动执行试试。
如上图,我们的第四条注意事项是:
- 当我们有多个目标文件时,我们会一个一个去查找直到找到了所依赖的文件存在的时候,才会去执行对应的指令,如果没有遇到则会有一个辅助栈依次存储对应的指令。
当然了,正常情况我们肯定不会向上面一样去写Makefile文件,我们会只保留生成.o文件和可执行程序的部分。如下:
但是此时我们还有一种写法:
这里我们第五条注意事项:
- Makefile中可以定义变量,只不过这个变量是没有类型的!!!!!,同时定义变量的方式空格必须紧挨着变量
现在来解释一下上述代码:
bin=proc # 定义目标文件
src=proc.o 定义依赖文件 $(bin):$(src) # (bin) 可以看做是上述变量的地址 $(bin)就是上述定义的变量gcc $^ -o $@ # $@ 代表着目标文件($(bin))# $^ 代表的是我们所依赖的目标文件列表,就是我们依赖目标文件可以传多个。%.o:%.c # %.c代表着通配符,只要是.c为后缀的都可以传入,代表着.c文件生成同名的.o文件gcc -c $<# $< 表示接受的.c文件列表,如果我们传入了 proc1.c,proc2.c,proc3.c#本质上是生成:# gcc -c proc1.c# gcc -c proc2.c# gcc -c proc3.c
.PHONY:clean
clean:rm -f $(src) $(bin)
那如果有两个.c文件需要编译呢?
如上图,我们第六条注意事项为:
- makefile
默认
只能形成一个目标文件。
那么此时如何做呢?如下图:
当然最后我们也可以生成同一个可执行程序,只需要把$(bin2)的依赖关系去掉,然后在$(bin1)后的所依赖目标把$(src2)加上即可。
总结make/makefile
好,make/makefile我们就讲到这里,我们来总一下我们所说过的5条注意事项:
make/makefile有一个缺省的执行程序,就是我们Makefile从上往下查找到的第一个目标文件,其余所需要的目标文件都要使用make + 目标文件名。
当我们make/makefile中途遇到错误的时候会直接终止程序,下面的代码不再执行
.PHONY会让编译器忽略文件时间的差异
当我们有多个目标文件时,我们会一个一个去查找直到找到了所依赖的文件存在的时候,才会去执行对应的指令,如果没有遇到则会有一个辅助栈依次存储对应的指令。
Makefile中可以定义变量,只不过这个变量是没有类型的!!!!!,同时定义变量的方式空格必须紧挨着变量
makefile
默认
只能形成一个目标文件。
进度条实现
那么有了上面的基础,我们可以使用Linux来实现一下进度条了,来看一下效果实现图:
在实现进度条之前我们有两个预备知识需要了解一下:
- 回车与换行
在C语言当中\n表示换行,但是C语言特殊处理过,\n表示效果为回车 + 换行。\r表示只回车
- 输出缓冲区
这里也不做过多的了解,只需举个例子即可。
如上图,在那两秒中我们的"hello Linux"到哪去了呢?其实就是到我们的输出缓冲区里面去了。而我们的’\n’可以强制刷新缓冲区。这里就需要使用fflush(FILE* stream)强制刷新缓冲区了。
C语言默认会打开三个流:stdin(标准输入流),stdout(标准输出),stderr(标准错误流)。而我们输出缓冲区就是我们的屏幕,所以我们只需要刷新stdout即可。
有了上面两个知识预备我们就可以来实现进度条了。
代码实现:
上述进度条只是我们的第一种,其实在实践当中我们一般都是登录界面会进行加载,那么这个加载的进度应该是跟我们加载了多少有关,而不是像上面那样固定的,所以我们实现第二个版本。
代码实现:
git的使用 (代码管理)
git是一种分布式多版本控制器,它可以支持多人协作,共同管理同一个项目。一下示例仓库都在gitee这个网站上方。这里我们只是为了管理我们的代码,所以只讲解基本的三板斧。
- git clone - 把远端仓库拷贝到本地
git clone + 仓库地址
- git add 把代码提交到暂存区
git add + 文件名,git add . 可以提交当前目录下所有文件。
- git commit -m “提交日志” - 把暂存区的提交到本地仓库
但是由于第一次使用git需要配置用户名和邮箱地址,直接把对应指令粘下来然后输入自己的即可。
- git push
把本地仓库的代码同步到远程的服务器上(gitee)
同时我们git可以支持windows和Linux不同系统操作同一个仓库,只不过在不同系统提交之后,在另一个系统需要使用git pull
来更新不同系统的本地仓库,不然会有冲突导致提交不上去。
我们也可以使用git log 来检查我们所有的提交记录,我们的commit信息也可以看到。
相关文章:

Linux开发工具的使用
文章目录 vim的使用基本模式介绍光标当前行操作(命令行模式)光标快速定位(命令行模式):插入模式的三种方式(命令行模式):vim基本操作(命令行模式)底行模式的操…...

【devops】devops-git之介绍以及日常使用
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...

012复杂度07leetcode
视频地址:012复杂度07leetcode_哔哩哔哩_bilibili 网站叫做leetcode。那Linux我相信很多同学都听过这个网站,那这个网站干嘛用呢?这个网站是用于练习算法的一个好网站,那我们这个课程在讲解知识点过程中也会不断的去用到这个网站,…...

4.网络编程
1、目的 传播交流信息TCP:打电话UDP:发短信 2、通信协议: httpTCP/IP簇:三次握手(aba),四次挥手(abba)https 3、IP与端口 1.IP地址类:InetAddress、InetSocketAddress InetAdd…...

OpenCV GUI常用函数详解
在OpenCV的High_level GUI模组中有很多GUI函数,下面介绍几个常用的函数。 图像显示窗口相关函数 生成图像显示窗口函数nameWindow() nameWindow()函数的原型如下: 函数用以创建一个给定名的图像显示窗口(后面简单叫做图像窗口)…...

Tuxera NTFS for Mac破解版下载 Tuxera NTFS for Mac2023激活码 mac电脑ntfs磁盘软件
Tuxera NTFS for Mac是一款优秀的Mac系统完全读写软件,提供Fat32、NTFS、Exfat、mac os扩展格式的转换,稳定性好,传输速度极快。Tuxera NTFS for Mac功能丰富,能修复NTFS卷、创建NTFS磁盘映像、创建NTFS分区等等。同时软件支持所有…...

oceanbase(ob)基于备份集搭建备租户方式
一、搭建备租户方式(基于备份的方式) 注意事项:要有一个源端OB集群和目标端OB集群。 1、新建主租户(如果原来有主租户可是省略) #创建unit create resource unit ut_2c2g max_cpu2, memory_size2G, max_iops10000,l…...

Javase复习day21算法、arrays、Lamdba表达式
常见算法 查找算法 基本查找 package search;public class BasicSearchDemo1 {public static void main(String[] args) {//基本算法(顺序查找)int[] arr {131,23,57,37,95,48,57,43};System.out.println(basicSearch(arr, 43));}public static boo…...

移动硬盘无法读取?别慌!这些方法助你恢复数据!
在我们的日常工作和生活中,移动硬盘作为重要的数据存储工具,承载着珍贵资料。然而,移动硬盘无法被电脑读取的情况时有发生,令人焦急。别慌,下面为大家详细介绍恢复移动硬盘数据的有效方法。 一、检查硬件连接和驱动问题…...

Java集合面试(上)
Java集合面试(上) 集合概述 Java 集合,也叫作容器,主要是由两大接口派生而来:一个是 Collection接口,主要用于存放单一元素;另一个是 Map 接口,主要用于存放键值对 说说List,Set,Queue&#…...

Python画笔案例-046 绘制小红伞
1、绘制小红伞 通过 python 的turtle 库绘制 小红伞,如下图: 2、实现代码 绘制 小红伞,以下为实现代码: """小红伞.py """ import turtledef draw_pattern():"""画填充圆弧"&…...

使用 .NET 6 构建跨平台 Worker Service 服务:跨越平台的 C# 服务开发——解决Windows服务跨平台问题
现代软件开发中,构建跨平台的应用程序变得愈加重要。C# 和 .NET 6 的出现使得在 Windows、Linux 和 macOS 上创建背景服务变得简单而高效。在本指南中,我们将通过创建一个使用 .NET 6 的 Worker Service 来展示如何实现跨平台后台服务。 项目概述 我们…...

terminator-gnome
gnome import os#启动节点指令变量 stere"ros2 launch stereo_c start.py" utils"ros2 launch task utils.launch.py" #tab标题 stere_title"stere_driver" utils_title"utils"#一个终端界面打开5个tab cmd1f"gnome-terminal --…...
7.测试用例设计方法 + Bug
一、正交实验法 1.使用场景 因果关系比较庞大的情况下,不太适合用因果图判定表,在这种情况下,一般会采用正交实验法。 2.例子: 字符属性设置(4个条件) 字体很多 字符样式很多 …...

uniapp小程序,使用腾讯地图获取定位
本篇文章分享一下在实际开发小程序时遇到的需要获取用户当前位置的问题,在小程序开发过程中经常使用到获取定位功能。uniapp官方也提供了相应的API供我们使用。 官网地址:uni.getLocation(OBJECT)) 官网获取位置的详细介绍这里就不再讲述了,大…...

Reactive 编程-Project Reactor
Reactive 编程与 Project Reactor Reactive 编程是一种编程范式,主要用于处理异步数据流。它旨在通过声明式的编程方式处理事件驱动的非阻塞任务,特别适合于构建响应式、可扩展、高并发的应用。随着互联网应用规模的扩大和响应速度的提升需求࿰…...

splice用法
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

Redis - 缓存
文章目录 目录 文章目录 1. 什么是缓存? 2. 使用Redis作为缓存 2.1 关系型数据库的缺点 3. 缓存的更新策略 3.1 定期生成 3.2 实时生成 缓存淘汰策略 4. 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿 缓存预热 缓存穿透 缓存雪崩 缓存击穿 总结 1. 什么…...

基于SpringBoot+Vue的养老院管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…...

多线程爬虫接入代理IP:高效数据抓取的秘诀
在现代网络环境中,爬虫已经成为获取信息的利器。然而,随着网站反爬措施的不断升级,单线程爬虫往往无法满足需求。多线程爬虫与代理IP的结合,不仅能提高效率,还能有效规避IP封禁问题。本文将详细探讨多线程爬虫接入代理…...

[网络][CISCO]Cisco-PIX配置详解
Cisco PIX防火墙配置指南 任何企业安全策略的一个主要部分都是实现和维护防火墙,因此防火墙在网络安全的实现当中扮演着重要的角色。防火墙通常位于企业网络的边缘,使内部网络与Internet之间或与其他外部网络互相隔离,并限制网络互访&#x…...

拒绝千篇一律,AI帮你定制独一无二的个人写真
每个女人都渴望展现最美的自己,你是否厌倦了拍出千篇一律的照片?今天,我要告诉你一个秘密,用简单三步,即可打造属于你的独一无二个人写真!文生图、蒙版换脸、图生图,三步化身超级模特࿰…...

在云服务器上安装 RabbitMQ:从零到一的最佳实践
🛠 1. RabbitMQ 简介 RabbitMQ 是一个开源的消息代理中间件,广泛应用于高并发、异步任务队列的场景中。在分布式系统架构中,RabbitMQ 可以充当消息的中转站,帮助不同服务之间进行高效的消息通信。 在这篇文章中,我们…...

【nginx】搭配okhttp 配置反向代理
nginx的默认是一个反向代理。 nginx会默认把输入的请求,转向其他的服务器执行。 这些转向的服务器与客户端发起的服务器不是同一个。 客户端只认识nginx,不知道ngiix转向何方。 正向代理修改okhttp的proxy,实际上很多代理都是正向的。 反向代理修改请求路径到nginx。 感觉还…...

Android V 广播注册和配置注意事项问题
现象 在Android V平台上,应用注册非Protected广播时,如果没有加导出flag会抛出异常导致进程crash。 E/AndroidRuntime: FATAL EXCEPTION: main java.lang.SecurityException: com.demo.myapplication: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORT…...

深入解读Docker核心原理:Namespace资源隔离机制详解
在容器技术中,资源隔离 是容器化能够实现轻量级虚拟化的关键技术之一。通过资源隔离,容器可以拥有自己的独立环境,确保容器之间互不干扰,从而实现应用的安全和稳定。Docker作为主流的容器平台,其核心的资源隔离机制依赖…...

学习通、智慧职教刷课脚本
🐐个人主页 可惜已不在 🐋可以分享给身边有需要的人🐶 🐉有用的话就留下一个三连吧😼 目录 一.安装 脚本运行器 篡改猴 - Microsoft Edge Addons 二.安装脚本 三.扩展 一.安装 脚本运行器 安装浏览器 Microsoft E…...

SEO写作:从实战到精进的全方位指南
在数字化浪潮中,SEO不再是简单的关键词堆砌,而是成为企业品牌建设与市场拓展的核心策略。作为一名深耕SEO领域的实践者,我深知其中的门道与奥秘。今天,我将结合过往实战经验,以独特视角,带你一窥SEO写作的精…...

解决 git 不是内部或外部命令,也不是可运行的程序
目录 报错提示: 一、解决办法 1、从git官网下载windows版本的git 2、安装 3、注意事项 二、报错 1、解决 fatal: Not a git repository (or any of the parent directories): .git 问题 报错提示: 一、解决办法 Windows下配置Git: 1…...

【卷起来】VUE3.0教程-07-异步请求处理(springboot后端)
🌲 服务端接口准备 pom文件,引入mybatis/mybatis-plus相关依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>&…...