Linux·权限与工具-yum与vim

1. Linux软件包管理器 yum

1.1 什么是软件包

在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。但这样做太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成Windows中的软件安装包)放在一个云服务器上,通过包管理器yum就可以获得这些编译好的软件包,直接进行安装。

yum (Yellow dog Updater , Modified) 是Linux下非常常用的一种包管理器,主要应用于Fedora,RedHat,Centos等发行版本上。

关于rzsz

这个工具用于Windows机器和远端Linux机器通过Xshell传输文件,安装完毕之后可以通过拖拽的方式将文件上传过去

注意事项

关于yum的所有操作必须保证主机网络畅通,可以用ping指令验证

查看软件包

通过yum list可以罗列出当前一共有哪些软件包,由于包的数目可能非常多,因此我们可以用grep或less命令查看

注意:

软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.

"x86_64" 后缀表示64位系统的安装包, "i686" 后缀表示32位系统安装包. 选择包时要和系统匹配.

"el7" 表示操作系统发行版的版本. "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.

最后一列, base 表示的是 "软件源" 的名称, 类似于 "小米应用商店", "华为应用商店" 这样的概念

1.2 如何安装软件

安装软件我们都会,但是这里要提醒一下,因为软件一般都是安装到 /usr/ 的某个路径下,而这个路径是只有root有权限写入的,因此安装软件时要以root身份安装,可以选择sudo或直接使用root账号安装

··············································

出现 complete 字样,说明安装完成

如果安装命令中不带 -y 选项,安装时可能就需要我们手动按 y 确认哪些软件包要安装。

1.3 如何卸载软件

一句命令

这个也可以加 -y 选项,防止询问

1.4 yum下载原理及yum源配置

yum 在下载的时候我们并没有去指定下载源,所有Linux软件都是在不同的云服务器上,那yum命令是如何知道到底该去哪个服务器上找这个软件呢?

这是因为yum背后有它的一个配置文件,这个配置文件中会记录这些软件的下载路径。就像我们更新某些手机软件的时候,这个软件并不是通过应用商店更新的,而是直接弹到浏览器上给你下载安装,那这个软件的更新系统怎么知道要从哪个网址上下载新版本的呢,也是因为有配置文件的存在,这个配置文件中记录了要更新的地址。

yum的配置文件路径一般在 /etc/yum.repos.d/

这些都是yum的配置文件,我们只需要看第一个 -Base 的那个。

这里我们进这个配置文件看看

可以看到这里面都是些网址,这就是各个软件的下载地址了。

因为我的这个系统是在华为云上买的云服务器,所以这些网址也都是华为云服务器中提供的。这些网址的提供商可能因为你这个系统从不同的地方搞到的,网址的提供商都会有所不同。

这个 CentOS-Base.repo 叫 yum源文件 ,里面的这些内容叫 yum源 因为yum要通过这些内容找到并下载软件,过程就是yum会根据自己系统的版本在那些蓝色的语句中一替换,然后在跟上白色的下载路径,最后形成一条下载链接,于是就可以把对应的软件从云上下载下来了。

如果不喜欢现在的yum源可以进行切换。

首先搜一下都有啥yum源,这个要选择国内的源,要是国外的可能下载特别慢或下载不了的问题。这种东西一搜就能搜到。

这里用阿里云的yum源举例,我的系统是CentOS-7的所以就选择对应的yum源

复制链接地址,然后进入Linux系统

把刚刚的链接wget弄进去,回车下载就有了这样一个文件,我们可以vim打开它看看

这里就是阿里云的yum源了,但是现在它们还没有生效,我们可以把之前的yum源文件备份一下防止出问题,然后把新yum源mv过去,再把名字改成老yum源的名字,就比如我这里就是CentOS-Base.repo 然后使用 yum clean all 清理一下缓存 yum makecache 重建yum缓存

然后我们下载东西就是用阿里云的镜像源下载了。


2. Linux编辑器 - vim的使用

2.1 vim的基本概念

vim有三种常用模式,分别是 命令模式(command mod) 、插入模式(insert mode) 、底行模式(last line mode) ,各模式的功能区分如下:

命令模式:

控制屏幕光标的移动,行或字符的删除,移动复制某区段。刚进入vim时默认在命令模式 的,在命令模式下按 "i" 进入插入模式 ,按 ":" 进入底行模式

插入模式:

输入文字,用于编写代码,按 "ESC" 返回命令模式

底行模式:

文件保存或退出,也可以进行文件替换,找字符串,set nu展示行号。在命令模式下敲出 **":"**即可进入底行模式,要查看所有模式可以输入 :help vim-modes

2.2 vim的基本操作

我们创建一个文件,然后用vim进入它

刚进入时是这个状态,现在就是命令模式

我们按 i 进入插入模式

这个时候我们才能输入文字

然后按 ESC 退出插入模式,回到命令模式,再输入 : 进入底行模式

输入 w(保存)q(退出) 回车就可以保存并退出了

出来之后我们可以cat看一下文件确实被写入了

2.2.1 vim命令模式命令集

插入模式

i 进入插入模式,从光标当前位置开始输入文件

a 进入插入模式,从目前光标的下一个位置开始输入文字

o 进入插入模式,在下一行插入新的一行并开始插入文字

移动光标

vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格

按「G」:移动到文章的最后

按「 $ 」:移动到光标所在行的"行尾"

按「^」:移动到光标所在行的"行首"

按「w」:光标跳到下个单词的开头

按「e」:光标跳到下个单词的字尾

按「b」:光标回到上个单词的开头

按「#l」:光标移到该行的第#个位置,如:5l,56l

按[gg]:进入到文本开始

按[#+G]:进入第#行,如50G

按「ctrl」+「b」:向"上"移动一页

按「ctrl」+「f」:向"下"移动一页

按「ctrl」+「u」:向"上"移动半页

按「ctrl」+「d」:向"下"移动半页

删除文字

x :每按一次,删除光标所在位置的一个字符

#x :例如,「6x」表示删除光标所在位置的"后面(包含自己在内)"6个字符

X :大写的X,每按一次,删除光标所在位置的"前面"一个字符

#X :例如,「20X」表示删除光标所在位置的"前面"20个字符

dd :删除光标所在行

#dd :从光标所在行开始删除#行

复制

yw :将光标所在之处到字尾的字符复制到缓冲区中。

#yw :复制#个字到缓冲区

yy :复制光标所在行到缓冲区。

#yy :例如,「6yy」表示拷贝从光标所在的该行"往下数"6行文字。 dd :剪切光标所在行

#dd :从光标所在行开始剪切#行

p :将缓冲区内的字符贴到光标所在位置。注意:所有与"y"有关的复制命令都必须与"p"配合才能完成复制与粘贴功能。

替换

r :替换光标所在处的字符。

R :替换光标所到之处的字符,直到按下「ESC」键为止 (替换模式)

~ :大小写快速切换

撤销上次操作

u :如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次"u"可以执行多次回退。

ctrl + r : 撤销的恢复

更改

cw :更改光标所在处的字到字尾处

c#w :例如,「c3w」表示更改3个字

跳出指定的行

ctrl + g :列出光标所在行的行号。

#G :例如,「15G」,表示移动光标至文章的第15行行首。

2.2.2 vim底行模式命令集

列出行号

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

跳到文件中的某行

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

查找字符

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

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

保存文件

w : 在冒号输入字母「w」就可以将文件保存起来

分屏操作

vs + 文件名:分屏操作

Ctrl + w :光标换屏,换到哪个屏操作哪个文件

离开vim

q :按「q」就是退出,如果无法离开vim,可以在「q」后跟一个「!」强制离开vim。

wq :一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。

ZZ :wq快捷键

q! : 强制退出

! + 命令 :暂时出vim执行命令,执行好之后回到vim

我们将vim编辑好之后,回车在外面执行一下编译

此时出现回车继续的提示,我们就回车继续编写vim

可以查看到这个新编译出来的文件,然后我们继续回车

成功执行了代码。

也就是说我们可以在不退出vim的情况下对代码进行编写,编译,运行。

2.2.3 vim视图模式命令

试图模式就是进行批量操作,或者说块操作

Crtl + v :进入视图模式

h j k l :移动光标框选区域

I(大写i) :块填写

d :块删除

2.3 简单vim配置

我们回到家目录,查看隐藏文件,查看一个叫 .vimrc 的文件,如果没有就自己新建一个

然后我们vim进这个配置文件

在里面设置一下set nu然后保存退出

现在我们再进vim的时候就不用我们手动呼出行号了。

vim在启动的时候会默认先读取一下这个 .vimrc 配置文件,也就是说,如果我们想给vim配置什么就往这个文件中添加就好了。

因为这个配置文件是配置在每个人的家目录下的,所以谁用vim打开的文件,那么就会去读谁的配置文件,就比如张三还没有配置vim,但是我用vim去打开他家中的文件时也是有行号的,但是他来打开我的文件就不会有行号。

关于vim再配置点啥的可以上网上看看。

这里提供一份vim配置成C++IDE的方法

使用普通用户输入以下指令,不要使用root账户:

curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh

卸载方法:

bash ~/.VimForCpp/uninstall.sh

配置好了之后被配置的这个用户的家目录下会有一个 install.sh 的文件这个文件不要删。

3. Linux编译器 gcc / g++ 的使用

gcc和g++的选项操作都是一样的,我之后统一使用gcc举例。

如果没有安装g++就在root身份下安装 gcc-c++ 软件即可

3.1 背景知识

一个程序从代码变成可执行程序中间要经历下面四个步骤:1. 预处理(进行宏替换) 2. 编译(生成汇编) 3. 汇编(生成机器可识别的代码) 4. 链接(生成可执行文件)

预处理阶段编译器主要进行,宏替换,文件包含,条件编译,去注释的处理,预处理指令都是 # 开头的代码行。选项 -E 会使gcc在预处理结束后停止编译过程

编译阶段编译器首先要检查代码的规范性,是否有语法错误等,无误后gcc把代码翻译成汇编语言。选项 -S 只进行编译而不进行汇编,只生成汇编代码

汇编阶段把编译阶段生成的.s文件转成目标文件。选项 -c 可以看到汇编代码将会转化成 .o 的二进制目标代码了

链接阶段最后生成可执行程序,选项 -o 为生成的文件命名

3.2 语法与选项

语法:

gcc [选项] 要编译的文件 [-o] 完成编译后的新文件

g++ [选项] 要编译的文件 [-o] 完成编译后的新文件

-o选项的用途就是为编译出来的新文件重命名的,如果不需要重命名的话 -o 和它后面的东西就都不用写了。

我们先用vim写个code.c文件出来

我这个vim就是已经用上面那个链接配置好了的

3.2.1 -E 预处理生成 .i文件

我们使用-E选项,命令编译器拿着代码只完成预处理就停下来生成一个 .i 文件。

这一步需要我们自己-o设定新文件的名字,否则直接 gcc -E code.c 是不会生成文件的,而是将预处理的整个过程刷屏。

下面我们vim进这个文件看看预处理之后的代码长什么样子

​​​​​​​ ​​​​​​​

上面都是声明、typedef等预处理内容,并且这些还都是c语言,我们直接翻到最后可以看到宏已经被替换了。

3.2.2 -S 编译生成汇编 .s 文件S

使用 -S(大写) 选项让编译器完成编译后就停下来,生成一个 .s 文件

这里我们可以不用指定新文件名称了,编译器会自己搞

​​​​​​​

我们直接把预处理好的文件拿给编译器去编译,省的编译器再从头来一遍。

下面我们 vim 打开 这个新文件

​​​​​​​

可以看到现在已经变成汇编代码了。

3.2.3 -c 汇编生成二进制 .o 文件

使用 -c 选项让编译器完成汇编后就停下来,生成一个 .o 文件

vim打开看看

​​​​​​​

现在就是一堆乱码了,也就是说这已经是个二进制文件了。

但此时这个二进制文件是不可执行的,不仅仅是因为权限,就算更改了权限这个文件也无法执行,因为它还没有和库链接,这个程序还不完整。

3.2.4 链接生成可执行文件

链接是没有选项的,gcc会自己完成这个操作,我们只需要给新文件改个名就行,甚至不改名让它自己生成一个名字也行

​​​​​​​ ​​​​​​​

现在彻底完成了广义上的编译器的编译生成可执行文件的过程,但是在实际应用的时候不用我们这样一个一个文件的生成,直接用最后这句 gcc code.o -o code.exe 一部到位。

3.3 链接的过程

我们可以通过 ldd 命令看到一个可执行程序需要链接的库

第一个和第三个不用看,我们直接看第二个库,这个可执行程序依赖一个叫 libc.so.6 的库,然后我们进入这个库的目录看看,可以看到这个库是C标准库中的内容。

上我们还可以去看看Linux命令需要的库

​​​​​​​

可以看到 ls命令 这里也链接了这个C的库,其他命令也是如此,由此我们可以得知Linux中的命令都是由C语言写的了。

3.3.1 动态库与静态库

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此在运行的时候就不需要链接别的库了,但如果这么做生成的文件就会比较大。其后缀名一般为 .a

动态库在编译链接时,不将库文件代码加入,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销,同时生成的可执行文件较小,但是一旦动态库出现问题那所有链接这个库的文件都要出问题。动态库后缀名一般为 .so

在windows中,动态库链接出来的文件一般以 .dll 结尾,静态库链接出来的文件一般以 .lib 结尾。

链接动态库的行为叫动态链接 ,链接静态库的行为叫静态链接

我们可以通过 file 文件名 指令查看到文件的链接属性

可以查看一下刚刚我们生成的code.exe文件,这里可以看到是动态链接属性

gcc编译器是默认进行动态链接的,如果想要静态链接需要在链接命令后面加 -static 选项

如果链接失败了说名没有装静态库,用两句代码装上就好

sudo yum install -y glibc-static sudo yum install -y libstdc++-static

装好后我们再用静态链接生成一下

可以看到静态链接的文件比动态链接的文件大了很多,这还只是链接了stdio.h一个库的状态,可以想象静态链接的文件是巨大的。

相关推荐
CoolTiger、2 小时前
【Vmware16安装教程】
linux·虚拟机·vmware16
m0_741768852 小时前
使用docker的小例子
运维·docker·容器
学习3人组3 小时前
CentOS 中配置 OpenJDK以及多版本管理
linux·运维·centos
厨 神3 小时前
vmware中的ubuntu系统扩容分区
linux·运维·ubuntu
Karoku0663 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
geek_Chen013 小时前
虚拟机共享文件夹开启后mnt/hgfs/下无sharefiles? --已解决
linux·运维·服务器
(⊙o⊙)~哦4 小时前
linux 解压缩
linux·运维·服务器
牧小七5 小时前
Linux命令---查看端口是否被占用
linux
最新小梦5 小时前
Docker日志管理
运维·docker·容器
鸡鸭扣6 小时前
虚拟机:3、(待更)WSL2安装Ubuntu系统+实现GPU直通
linux·运维·ubuntu