linux:回车换行+进度条+git理解与使用以及如何解决免密码push问题

目录

特殊符号

Linux小程序---进度条

1.\n和\r的理解

2.缓冲区

3.设计简单的倒计时

4.设计简单的进度条

 git-版本控制器

1.理解什么是版本控制器?

2.git的使用

3.git的其他说明

 总结上传过程


特殊符号

1.@(取消显化)

@的作用:执行指令,但指令本身不会显化;
举个例子:我在编译code文件的同时打印一些注释;

code:code.cecho "编译开始..."gcc code.c -o codeecho "编译结束..."
.PHONY:clean
clean:rm  -f codeecho "清理文件完毕..."

 但是实际上执行make后的结果并和我们想的不一样:因为默认下,makefile文件会执行指令语句,并且把指令显化;
387f701173b94fd382ca9ab4a5ccd8cb.png

对于这种问题,我们只需要在不需要显化的雨具前面加上@,就可以告诉makefile,只执行指令,不显化;

6622b989e07f467082fc0330b2385cbf.png

2.%(通配符)和$<(将文件挨个传递)和$^(将全部文件一块执行指令)

在Linux的makefile中
%被视作为通配符,比如%.c就是代表所有的.c任意以点.c结尾的文件;
$<:将文件中的一个一个的分别都指令依次该指令;

注意:1.$<和$^是相对依赖文件而言的并不能对目标文件使用;
2,在编译时,目标文件只能有一个,如果有多个,就需要指定新的规则;现在我们默认为多个木匾文件是不允许的;

这么说比较抽象,我们来看个例子:

1.使用文件变量将多个文件编译同时编译

这里我以new.c和new.h为例,将他们同时编译生成可执行文件new;

dest=new
src=new.c new.h
$(dest):$(src)gcc   $^ -o $@

98bd5f2a2f8a4159b5cd08ab6c66a5c2.png

dest和src是两个文件变量,用于储存文件地址,$(文件变量)就相当于是对文件解引用了;$^此时就是new.c 和new.h两个组成的整体;$@就是目标文件new;

这里的$@是可以替换成$(dest)的;

2.如何同时编译两个可执行程序

这里我们需要使用伪目标all;

.PHONY:all
all:code proccode:code.cgcc code.c -o code
proc:proc.cgcc proc.c -o proc.PHONY:clean
clean:rm -rf code proc

这里的all的依赖关系其实是一个幌子,因为查找是从上往下的,all需要依赖可执行程序code和proc,那么makefile就会向下继续执行指令,直到将code和proc生成,生成后而我们并没有使用code和proc对all进行什么操作;然后就结束了;在此过程中all其实就是一个引子, 通过依赖关系引出code和proc;实际上并非是all依赖于code和proc;

72e1f06357854aa2bf0b17a79fe1eedb.png

此时我们make一下,两个文件就会同时编译生成可执行文件了;

Linux小程序---进度条

1.\n和\r的理解

回车和换行其实是两个概念,顾名思义,回车就是回到行的开头,换行就仅仅只是到了下一行而已,列的位置并没有发生改变;
我们所使用的\n其实是别人优化好的回车和换行的组合;真要区分\n是换行,\r是回车;

2.缓冲区

接下来要用到sleep函数,我们现在看一下他的介绍;c1ae99624a68419e93b173f2589840ea.png

sleep为休眠函数,单位是秒;头文件是unistd.h;

接下来我们用sleep来区分一下\n和\r

#include<stdio.h>
#include<unistd.h>int main()
{printf("hello linux\n");sleep(2);
}

这里的运行结果是先打印"hello Linux,并且换行,2秒之后才出现了指令行;这都没什么问题;

但是如果我把\n删除了呢,这时会是什么结果?

1f7b667ce4bc48dc856ab1220c5a0d0f.png

运行结果并没有先打印"hello linux"而是2秒之后,hello linux和指令行一块打印出来了;

思考:为什么没有先打印hello linux呢?

printf("hello linux");没有换行,执行完这条语句其实是储存在缓冲区中的,缓冲区没有满或者没有被刷新在程序结束之前是不会输出的,这就是为什么没有先打印hello linux的原因;

这段程序中,缓冲区没有在sleep之前刷新,而是睡眠后,等到了程序结束,自动刷新了缓冲区;这时才打印了字符串;

如果我们想要不换行就可以解决缓冲区不刷新的问题,那就需要fflush(stdout)对缓冲区进行强制刷新;

#include<stdio.h>
#include<unistd.h>int main()
{printf("hello linux");fflush(stdout);sleep(2);
}

这个时候执行完printf后就会在睡眠之前打印字符串; 

3.设计简单的倒计时

我们需要三个文件processbar.c  processbar.h  main.c 

接下来我们实现一个倒计时为10的计时器;

我们需要考虑几个问题::
1.倒计时其实就是一个数字然后递减打印;
2.每次打印之间需要有时间间隔;
3.打印之前需要覆盖之前的数字;

6ef1f71dc69b4bb18930605d2a75794c.png

571d85a87f724914b8c26feda0a2c06b.png

 但是如果我们打印从10开始的倒计时,一开始是两位数,后面变成了一位数,那这是第二位数是没有被覆盖的;因此我们需要调整下格式为2个宽度,左对齐;

4.设计简单的进度条

1.'#'持续推进,
2,每一部分需要使用[]括起来;
3.还需要有进度百分数,类似于旋转加载的符号
这里我们使用laebl="/|-\\"来模拟加载的符号;

void processbar()
{const char* label="/|-\\";char bar[NUM];memset(bar,'\0',sizeof bar);int cnt=0;int len=strlen(label);while(cnt<=100){printf("[%-100s][%d%%][%c]\r",bar,cnt,label[cnt%len]);fflush(stdout);bar[cnt++]=STYLE;usleep(10000);}printf("\n");return ;
}

49950aab64fa44df92eff85b1a714086.png

 设计进度条外部调用版本

#include"processbar.h"const char* label="/|-\\";char bar[NUM];void processbar(int rate)
{       if(rate<0||rate>100)return ;        int len=strlen(label);                      printf("[%-100s][%d%%][%c]\r",bar,rate,label[rate%len]);fflush(stdout);bar[rate++]=STYLE;
}       

#include "processbar.h"int main()
{int total=1000;int cur=0;while(cur<=total){processbar(cur*100/total);cur+=10;usleep(50000);}printf("\n");return 0;
}

7f08784f6feb4561855457dc04b3b778.png

 git-版本控制器

安装git指令
root用户:

yum install git

ubuntu用户:

sudo apt install -y git

1.理解什么是版本控制器?

  讲一个故事:

       比方说老师要求我们交一份实验报告,而你的室友张三是一个非常勤奋的人,所以他很早就写好了第一版交给老师,但老师的要求很高,他觉得第一版不行,给了他一些修改意见,然后他在第一版的基础上写完第二版后,老师还是不满意,他又在第二版的基础上写出了第三版……就这样一直下去,当张三写到第八版的时候,老师发现他越改越差,还不如第二版,于是让张三交第二版就行,但此时张三就慌了,因为他一直在原来版本上修改,所以早就忘了第二版是什么样子的了。而你吸取了张三的教训,你也开始做实验报告,但是跟张三不同的是,每次老师给你打回来的时候,你都会将原先版本给保存一份然后再去修改,最后当老师想要第二版的时候,你就可以直接可以把第二版拿出来。(我在有意识地在保留前面的版本,因为可能未来会用到)

         除此之外还有其他同学也要交实验报告,于是你想到了一个办法,你在老师办公室门口贴了一个告示“这个老师可能改到最后会需要之前的版本,你们可以加我微信,我给你们提供保存之前版本的服务”,于是乎很多同学开始加你的微信,然后你就开始给李四、王五、赵六……分别建了目录,他们会将旧的版本发给你保存,然后当他们需要的时候,找到你就可以找到之前的版本了。(说明许多人会存在这样的需求,可以提供相关的服务)

       但是你的业务做得越来越大,你不断在复制和粘贴,不断有人找你索要之前的版本,你有点忙不过来了,于是你在思考:其实版本管理本质上不就是对文件进行重命名、拷贝等工作吗??那我能不能写一些软件来自动化这些无聊繁琐的工作??于是乎你写出了两个软件,一个是服务端负责版本管理,另一个是客户端负责给用户查看。然后你把两个软件合成了一个既可以做服务端也可以做客户端的软件(版本控制器的雏形开始出现了)

        你给自己放置版本的地方起名叫做仓库,而当别人下载了你的软件之后,他如果在自己的电脑上做版本控制,那就是本地仓库,但是他可能会担心本地仓库的东西丢失,于是他又使用了你提供的云服务器,那就是远端仓库,然后推送到远端仓库。(所以git其实就是一款服务端和客户端为一体且具有网络功能的版本控制器,作用其实就是一种将客户的本地仓库和由你提供的云服务器上的远端仓库建立一个联系,帮助我们更好的版本管理和控制,远端仓库一般是大公司提供的云服务器,一般不会出问题,可以有效防止文件丢失)

        其实实验报告都是有模版的,所以我们并不是非要每个人都写一份,可以是共同维护一份,这个操作就可以在远端进行(所以git还有一个作用就是方便多人协作)

总结:

1、git是一款服务端和客户端为一体的具有网络功能的版本控制器

2、方便多人协作

 当然在现实中,其实例子中的老师就相当于是我们的产品经理,而学生就相当于程序员,一个团队里面产品经理需要去分析用户的需求,然后再分工给程序员去完成项目,但是客户的需求可能是会不断发生变化的,所以这也就意味着我们需要对每一个版本都进行有效的管理和保持。

2.git的使用

4373716b1cc0407da4aa8b9ed990797d.png

创建之后点击克隆;
f681806d26fa498e96d06fec7469fc4d.png 找到地址,把远程仓库拉到本地(<提示的上面就是仓库的地址>)

使用指令(注意这里的仓库地址,是你自己的仓库地址)

git clone https://gitee.com/lq17530393678/git_test.git

这里输入完指令后,会确认你的身份;你需要按照指示复制就可以了;私人令牌你自己创建一个就可以了;

注意:私人令牌之后就无法查看了,一定要保存好,截图或者把字符串拷贝下来;51b21ca38ab5469ba8ae70cdd83465bf.png

 创建成功后赋值令牌到命令行就确认身份成功了;

a34ac663cc864316883f4b2e78480f6f.png

f2efa79e02a448158b6aff92462f791c.png

然后发现 在当前目录下出现了你的新建仓库文件(git_test);这个文件就是你仓库;以后我们只需要把文件放在git_test仓库中就可以了;

现在我将code.c拷贝一份放在了gittest中,试着将gittest传到仓库git_test中;

9d0c3c64483449bf821ed3605b788443.png

在此目录下使用指令:

git add .   #add和.不能挨着
git commit -m "hello linux"   #这里的备注一定要好好写

fb670b463aec4dfcad31e7430e96aeeb.png

 git push

4a78dfb4e5eb4cfcb37cc73081bafb17.png

 到这里,我们发现仓库中出现了刚才的测试文件;169bb47ff9154023aed6c50ea6d0c897.png

其实这也对应了再windows中的我们上传代码的方式;
在windows中,我们就是先把目标文件放到仓库中,然后将文件add ->commit->push;步骤是一样的;

3.git的其他说明

1.我们还可以查看git仓库的提交记录,(到这里我们就可以发现,在git仓库下执行的命令都是git +指令)

git log

38d086c869094fe594922b0fcd978856.png

2. 还可以查看当前目录的状态

git status

047f8a361be343f6a7b918d385d6108f.png

我在仓库里创建了一个新文件,但是这时候并不能说明,他就在远程仓库里,因为我还没上传,这时候他与远程仓库没有任何关系;正如提示所说,"use ""git add ....."下一步应该添加该文件;d25ca2a2822f4d56af2a4037c81b27e6.png

在push之前在gitee网页上是看不到的;我们push之后才可以看到 ;

 总结上传过程

我们如果要把文件上传到git仓库中骂我们需要先把文件上传到本地仓库,本地仓库就是我们通过gitee上仓库地址克隆的;而git就是远程仓库,gitee是git的可视化软件网页;

1.add:add的作用就是将当前仓库下的(未add)的文件提交到工作区(这个了解即可);

2.commit(提交):commit的作用是将工作区的文件提交到本地仓库,没错,就是本地仓库,这里有一个易错点;

仅仅将文件拉到git仓库文件里并不算是添加进了仓库;就好像你是110班的你要转班,进到了112班级里,虽然你跟别人在同一个屋子里,但是你的身份并不是112的;你需要经过一定的流程才能成功转班;

现在,你平白无故坐在了112班里,而这个班的老师看你不是本班的学生,就问你,你说你想要来112班上课,这时候就相当于是给仓库的管理员传达了指令我要add进你们班,然后老师(工作区)给了你一个申请表,你会去写完后,交给了老师这就是commit操作,将工作区的文件提交到本地仓库,然后老师把你的申请表push给了领导,成功后,领导把教务系统(远程仓库)的数据修改,你才能正式变成112班的学生;
3.push:将本地仓库的文件同步到远程仓库;这个本地仓库上传是否成功是有图标显示的;而查看是否成功传到远端仓库需要我们打开gitee网页,查看是否有目标文件即可;

所以综合下来共有下面几种情况:

1.没有add:在git本地仓库的目录下,但是并未添加到工作区,也就是并没有准备上传;
2.add了没有commit:add之后文件添加到了工作区,但是没有提交到本地仓库;
3.commit了没有push:提交到了本地仓库,没有同步到远程仓库,这是并不能起到安全的保存代码,仅仅是原代码的拷贝文件而已;
4.三个操作都做了:本地仓库有文件的拷贝,远程仓库也有文件的拷贝,本地仓库不小心搞丢了或搞坏了,都无伤大雅,远程仓库人家公司帮你把门呢;在gitee就能使用;

4..gitignore可以忽视我们不想上传的文件

208b3cf310584198a8241b0d82edb25f.png

1.这是一个配置的文件,以文件中出现的后缀的文件,是不允许被添加进git仓库中的;
2.*是一个通配符,我们在前面因为学过通配符%,*的范围更大,%是当前目录下的通配符,*是系统的通配符;
3.文件是可以自行配置的,可以自己另行添加不行上传的以某种后缀结尾的文件;

如何解决免密码问题

1.进入你的git本地仓库目录;
2.输入指令git config --global credential.helper store
3.在输入一次你的用户名和私人令牌码
之后再次push就不需要每次身份认证了;

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

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

相关文章

vscode摸鱼学习插件开发

不知道大家在摸鱼的时候&#xff0c;会不会想要学习&#xff1f; 或者有没有考公人&#xff0c;下班要学习的&#xff1f; 上班时间摸鱼&#xff0c;下班时间不够学习&#xff1f; 为此&#xff0c;我决定开发一个vscode插件&#xff0c;来刷粉笔题 粉笔插件名称&#xff1a;…

如何解决RabbitMQ消息的重复消费问题

什么情况下会导致消息的重复消费——在消费者还没成功发送自动确认机制时发生&#xff1a; 网络抖动消费者挂了 解决方案 每条消息设置一个唯一的标识id幂等方案&#xff1a;【Redis分布式锁、数据库锁&#xff08;悲观锁、乐观锁&#xff09;】 面试官&#xff1a;如何解决…

Kafka 与传统 MQ 消息系统之间有三个关键区别?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka 与传统 MQ 消息系统之间有三个关键区别&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Kafka 与传统 MQ 消息系统之间有三个关键区别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 …

软件测试基础知识最强总结(2024版)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是软件&#xff1f; 软件是计算机系统中的程序和相关文件或文档的总称。 二、什么是软件测试&#xff1f; 说法一&#xff1a;使用人工或自动的手段…

智慧用电监控装置:引领0.4kV安全用电新时代

在智能科技日新月异的今天&#xff0c;电力安全与管理正迎来一场前所未有的革新。为0.4kV以下TT、TN系统打造的智慧用电在线监控装置不仅重新定义了电力监控的边界&#xff0c;更为建筑安全用电筑起了一道坚不可摧的防线。 装置集成了单、三相交流电精确测量、四象限电能计量、…

【GL09】(算法)卡尔曼滤波

一、简介 卡尔曼滤波&#xff08;Kalman Filter&#xff09;是一种有效的递归滤波器&#xff08;自回归滤波器&#xff09;&#xff0c;它能够从一系列的包含统计噪声的测量中估计动态系统的状态。卡尔曼滤波广泛应用于信号处理、控制理论、自动驾驶、金融等领域。 基本公式&am…

IIC学习总结

一、基本概念 IIC&#xff08;Inter-Integrated Circuit&#xff09;其实是IICBus简称&#xff0c;所以中文应该叫集成电路总线&#xff0c;它是一种串行通信总线&#xff0c;使用多主从架构。 二、模块结构 I2C串行总线一般有两根信号线&#xff0c;一根是双向的数据线SDA&…

go 聊天系统项目-1

1、登录界面 说明&#xff1a;这一节的内容采用 go mod 管理【GO111MODULE‘’】的模块&#xff0c;从第二节开始使用【GO111MODULE‘off’】GOPATH 管理模块。具体参见 go 包相关知识 1.1登录界面代码目录结构 代码所在目录/Users/zld/Go-project/day8/chatroom/ 1.2登录…

qt QCheckBox详解

QCheckBox 是 Qt 框架中的一个控件&#xff0c;用于创建复选框&#xff0c;允许用户进行选择和取消选择。它通常用于表单、设置界面和任何需要用户选择的场景。 QCheckBox继承自QAbstractButton类&#xff0c;因此继承了按钮的特性。它表示一个复选框&#xff0c;用户可以通过…

使用Postman发送POST请求的指南

作为一名软件测试工程师&#xff0c;掌握如何使用Postman发送POST请求是非常重要的技能。POST请求通常用于向服务器发送数据&#xff0c;以创建或更新资源。本文将详细介绍如何在Postman中发送POST请求&#xff0c;帮助你高效地进行接口测试。 什么是POST请求&#xff1f; PO…

2024年meme币走势分析:最后两个月的市场趋势与机会 #交易所#dapp#KOL社区合作

2024年即将步入尾声&#xff0c;meme币市场经历了显著的波动。对于加密市场来说&#xff0c;年底的走势尤为关键&#xff0c;尤其是meme币这种受市场情绪影响较大的加密资产。本文将从市场环境、宏观经济因素、投资者情绪、技术分析等方面分析meme币在2024年最后两个月的潜在走…

python读取视频并转换成gif图片

1. 安装三方库 moviepy 将视频转换成gif&#xff0c;需要使用 moviepy库 确保已经安装了moviepy库 pip install moviepy2. 代码实现&#xff1a; from moviepy.editor import VideoFileClipmyclip VideoFileClip("video.mp4") myclip2 myclip.subclip(0, 10).re…

opencv - py_imgproc - py_filtering filtering 过滤-卷积平滑

文章目录 平滑图像目标2D 卷积&#xff08;图像过滤&#xff09;图像模糊&#xff08;图像平滑&#xff09;1. 平均2. 高斯模糊3. 中值模糊4. 双边滤波 其他资源 平滑图像 目标 学习&#xff1a; 使用各种低通滤波器模糊图像将定制滤波器应用于图像&#xff08;2D 卷积&…

大数据新视界 -- 大数据大厂之数据质量管理全景洞察:从荆棘挑战到辉煌策略与前沿曙光

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

如何保护网站安全

1. 使用 Web 应用防火墙&#xff08;WAF&#xff09; 功能&#xff1a;WAF 可以实时检测和阻止 SQL 注入、跨站脚本&#xff08;XSS&#xff09;、文件包含等常见攻击。它通过分析 HTTP 流量来过滤恶意请求。 推荐&#xff1a;可以使用像 雷池社区版这样的 WAF&#xff0c;它提…

大模型中的token是什么;常见大语言模型的 token 情况

目录 大模型中的token是什么 常见大语言模型的 token 情况 大模型中的token是什么 定义 在大模型中,token 是文本处理的基本单位。它可以是一个字、一个词,或者是其他被模型定义的语言单元。简单来说,模型在理解和生成文本时,不是以完整的句子或段落为单位进行一次性处理…

redis安装使用

1. 下载地址 下载最新稳定版本的 redis-windows 7.x 版本(本实例以 7.2.3 为例) # 下载地址 https://download.csdn.net/download/qq827245563/89923840 2. 解压文件 3. 下载可视化工具 # 下载地址 https://download.csdn.net/download/qq827245563/89940627 4. 启动运行 …

ELK + Spring Boot:日志分析入门与实践(一)

目录 一、安装ELK 1.1 版本选择 1.2 linux环境安装 1.3 ES配置启动 1.4 Kibana配置启动 1.5 Logstash配置启动 二、项目调整 2.1 pom依赖调整 2.2 yml配置文件调整 2.3 logback-spring配置 三、日志查询分析 3.1 创建索引模式 3.2 查询日志数据 一、安装ELK 1.1 …

elasticsearch 8.x 插件安装(六)之Hanlp插件

elasticsearch 8.x 插件安装&#xff08;六&#xff09;之Hanlp插件 elasticsearch插件安装合集 elasticsearch插件安装&#xff08;一&#xff09;之ik分词器安装&#xff08;含MySQL更新&#xff09; elasticsearch 8.x插件&#xff08;二&#xff09;之同义词安装如何解决…

vi —— 终端中的编辑器

目标 vi 简介打开和新建文件三种工作模式常用命令分屏命令常用命令速查图 01. vi 简介 1.1 学习 vi 的目的 在工作中&#xff0c;要对 服务器 上的文件进行 简单 的修改&#xff0c;可以使用 ssh 远程登录到服务器上&#xff0c;并且使用 vi 进行快速的编辑即可常见需要修改…