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

news2024/10/30 17:26:12

目录

特殊符号

Linux小程序---进度条

1.\n和\r的理解

2.缓冲区

3.设计简单的倒计时

4.设计简单的进度条

 git-版本控制器

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

2.git的使用

3.git的其他说明

 总结上传过程


特殊符号

1.@(取消显化)

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

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

 但是实际上执行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 proc

code:code.c
        gcc code.c -o code
proc:proc.c
        gcc 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.coloradmin.cn/o/2228142.html

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

相关文章

智能家居10G雷达感应开关模块,飞睿智能uA级别低功耗、超高灵敏度,瞬间响应快

在当今科技飞速发展的时代&#xff0c;智能家居已经逐渐成为人们生活中不可或缺的一部分。从智能灯光控制到智能家电的联动&#xff0c;每一个细节都在为我们的生活带来便利和舒适。而在众多智能家居产品中&#xff0c;10G 雷达感应开关模块以其独特的优势&#xff0c;正逐渐成…

什么品牌的护眼台灯比较好?五款目前比较好用的护眼台灯

在当今社会&#xff0c;近视已成为一种普遍现象&#xff0c;其背后的原因复杂多样。除了部分由遗传因素导致外&#xff0c;不良的用眼习惯和不适宜的照明环境也是不可忽视的重要因素。长时间盯着电子屏幕、阅读时光线过强或过弱、坐姿不正等&#xff0c;都可能给眼睛带来额外的…

redis详细教程(4.GEO,bitfield,Stream)

GEO Redis GEO 是 Redis 数据库中的一个功能模块&#xff0c;自 Redis 3.2 版本开始引入&#xff0c;专门用于处理地理位置信息。这个模块使得 Redis 能够存储并查询地理坐标&#xff0c;非常适合用于需要地理位置数据的应用&#xff0c;如实时位置查询、地理围栏、距离计算等…

Kafka 基础入门

文章内容是学习过程中的知识总结&#xff0c;如有纰漏&#xff0c;欢迎指正 文章目录 前言 1. 核心概念 1.1 Producer 1.2 broker 1.3 consumer 1.4 zookeeper 1.5 controller 1.6 Cluster 2. 逻辑组件 2.1 Topic 2.2 Partition 2.3 Replication 2.4 leader & follower 3. …

苹果生态的机器学习和同态加密

1. 引言 Apple认为隐私是一项基本人权。其保护用户隐私的工作遵循一系列隐私原则&#xff0c;其中一项原则是优先使用设备上的处理。通过在用户设备上本地执行计算&#xff0c;有助于最大限度地减少与 Apple 或其他实体共享的数据量。当然&#xff0c;用户可以请求由机器学习 …

甲骨文云免费20G对象存储挂载到VPS

准备条件 1.一个获取到免费vps的甲骨文账号Cloud Infrastructure | Oracle 2.一台需要挂载的VPS跳转中 - 有云短链接 3.用到的开源项目https://github.com/s3fs-fuse/s3fs-fuse 一、甲骨文账号端操作 1.1获取存储桶名称和名称空间 进入甲骨文账号,依次如图打开-存储-存储桶…

开源的GPT-4o模型使用指南,Mini-Omni2集视觉、语音和双工能力于一体的

1. Mini-Omni2 是什么&#xff1f; Mini-Omni2 是一个开源的多模态语言模型&#xff0c;旨在模拟 GPT-4o 的视觉、语音和文本处理能力。它能够理解和生成视觉、听觉和文本内容&#xff0c;并支持实时的语音输出和灵活的双工交互。 Mini-Omni2 由清华大学和 Inspirai 的研究人…

【C++】string 类深度解析:探秘字符串操作的核心

快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 目录 &#x1f4af;前言 &#x1f4af;为什么要学习 string 类 &#xff08;一&#xff09;简化操作 &#xff08;二&#xff09;确保安全 &#xff08;三…

卷积神经网络实验三:模型优化(1)

作者有话说&#xff1a; 这篇文章写的还是比混乱的。因为本人也是第一次做这样的尝试&#xff0c;虽然接触深度学习有一年了&#xff0c;但是对于模型的优化仅仅是局限于理论上。通过这一次的实验&#xff0c;我对于模型的理解也更深了几分。我不期望这篇文章能帮你能解决多大问…

clickhouse运维篇(三):生产环境一键生成配置并快速部署ck集群

前提条件&#xff1a;先了解集群搭建流程是什么样&#xff0c;需要改哪些配置&#xff0c;有哪些环境&#xff0c;这个文章目的是简化部署。 clickhouse运维篇&#xff08;一&#xff09;&#xff1a;docker-compose 快速部署clickhouse集群 clickhouse运维篇&#xff08;二&am…

嵌入式浏览器 -- Chromium VS Firefox

嵌入式浏览器概念 嵌入式浏览器是嵌入式系统中的核心组件之一&#xff0c;用于为设备提供网络访问能力和内容显示功能。与传统PC浏览器相比&#xff0c;嵌入式浏览器更加注重性能优化和资源效率&#xff0c;同时确保核心功能可用&#xff0c;如HTML渲染、JavaScript支持和多媒…

CSP-J2024入门级T3:小木棍

题目链接 CSP-J2024T3:小木棍 题目描述 小 S 喜欢收集小木棍。在收集了 n n n 根长度相等的小木棍之后,他闲来无事,便用它们拼起了数字。用小木棍拼每种数字的方法如下图所示。 现在小 S 希望拼出一个正整数,满足如下条件: 拼出这个数恰好使用

Ubuntu 20.04 安装 OpenCV 和 OpenCV_contrib 教程

Ubuntu 20.04 安装 OpenCV 和 OpenCV_contrib 教程 Ubuntu 20.04 安装 OpenCV 和 OpenCV_contrib 教程前言 OpenCV概述核心功能优势特点应用领域安装与使用 OpenCV_contrib概述核心功能具体模块 安装与使用一、准备工作二、下载OpenCV和OpenCV_contrib三、编译和安装OpenCV四、…

shodan5,参数使用,批量查找Mongodb未授权登录,jenkins批量挖掘

查找美国安全局漏洞 nww.nsa.gov&#xff08;美国安全局官方网站) net参数使用 搜索指定的ip网段 shodan search --limit 10 --fields ip_str,port net:208.88.84.0/24 (老美国家安全局的一个网段)可能直接访问不太行&#xff0c;可以使用host参数&#xff0c;得到域名再去…

nrm的使用

在安装nrm之前&#xff0c;要先完成node.js的安装。 1、nrm的介绍 ‌nrm&#xff08;npm registry manager&#xff09;是一个npm源管理器&#xff0c;允许用户在不同npm源之间快速切换。 关于npm和nvm的介绍&#xff0c;详见文章nvm的使用-CSDN博客。 解释&#xff1a;比如…

图片懒加载(自定义指令)

----------------------------------------------------------- 图片懒加载自定义指令使用mock模拟随机图片列表组件如下&#xff08;主要内容&#xff09;&#xff1a;配置自定义指令 图片懒加载 实现思路 使用自定义指令实现通用图片懒加载&#xff08;在图片到达视口内时再…

socket编程---UDP

目录 一、socket 二、socket接口 1.流程原理 2.代码 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; socket编程又称套接字编程&#xff0c;指进行网络通信程序的编写 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、soc…

R语言机器学习算法实战系列(十四): CatBoost分类算法+SHAP值 (categorical data gradient boosting)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍CatBoost的原理CatBoost的步骤教程下载数据加载R包导入数据数据预处理数据描述数据切割设置数据对象调节参数训练模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC Curv…

创建ODBC数据源SQLConfigDataSource函数的用法

网络上没有这个函数能实际落地的用法说明&#xff0c;我实践后整理一下&#xff1a; 1.头文件与额外依赖库&#xff1a; #include <odbcinst.h> #pragma comment(lib, "legacy_stdio_definitions.lib") 2.调用函数&#xff1a; if (!SQLConfigDataSourceW(…

HCIP-HarmonyOS Application Developer V1.0 笔记(一)

HarmonyOS的系统特性 硬件互助&#xff0c;资源共享;一次开发&#xff0c;多端部署;统一OS&#xff0c;弹性部署。 分布式软总线&#xff1a;分布式任务调度、分布式数据管理、分布式硬件虚拟化的基座 18N的独立设备 1个手机&#xff0c;8种设备&#xff08;车机&#xff0c…