请君浏览
前言
本专题将介绍关于Linux操作系统的种种,那么基于上一章讲述的是对于linux中的权限的概念,本章将讲解关于Linux中的基本开发工具编辑器vim与编译器gcc。(本章节默认使用的环境是centos 7.8)
俗话说的好——“工欲善其事,必先利其器”。想要真正学会一款操作系统,那么合理的利用各种工具(也就是我们所说的软件)是必不可少的。但是想要用这些工具,我们首先要下载安装这些软件,下面先让我们来看一看在Linux下如何下载安装软件。
1. 软件包管理器
1.1 linux中安装软件
这里我们所说的工具其实就是各种可以给我提供帮助的软件。在windows系统中,我们想要安装软件可以在浏览器上搜索对应的软件进行下载安装,也可以在对应的应用商店中进行下载安装,那么在Linux中我们该如何去下载呢?在Linux中安装软件的方案常见的有三种:
使用源代码安装。
首先我们知道,每一个软件都是通过各种代码编译出来的,那么只要我们有了相应软件的源代码后进行编译,便可以得到可执行程序。这是一个在Linux下安装软件的通用方式,但是这样在面对一个大型软件或者闭源的软件时会很麻烦。除非在某些极端情况下只能使用它,一般情况下不推荐使用。
rpm包安装。
在我们下载安装一个软件时,我们并不是只安装一个可执行程序,还需要安装它所对应的各类插件、库等,我们把这些称作依赖,也就是说当我们下载A软件时不仅要下载A软件,还需要下载它所需要的各种依赖,这样它才以正常运行。举一个简单的例子,当我们编译运行C语言代码时需要用到各种库,我们要成功运行这些代码就需要有这些库,没有的话代码就无法运行。例如在windows中一个普通的画图软件,如下图所示,除了对应的可执行程序,剩下的我们都可以理解为它的依赖,如果有的依赖缺失轻则软件功能缺失,重则软件直接无法运行:
在Linux中把我们要下载的软件打了一个包,叫做rpm包,但是在这些rpm包中只有对应的应用程序,而没有对应的依赖。因此如果使用rpm包进行下载我们还需要去自己下载它所依赖的各种库,特别麻烦,所以也不推荐使用。
包管理器进行安装–
yum/apt
。yum(Yellow dog Updater, Modified)
是Linux下⾮常常⽤的⼀种包管理器. 主要应⽤在Fedora, RedHat, Centos等发⾏版上。Ubuntu:主要使⽤
apt(Advanced Package Tool)
作为其包管理器。apt同样提供了⾃动解决依赖关系、下载和安装软件包的功能。在Linux中我们最常用的安装工具(虽然它也是工具,但在我们使用的这些发行版中是提前预装好的)就是包管理器,在Centos下是yum,在Ubuntu下是apt,它们的指令与功能基本上是一样的,只有在一些地方右细微的差别。使用包管理器安装软件是我们在Linux中安装软件最常用的方法。
在上面三种安装方式中最为简单以及方便的就是使用包管理器了,软件的发布者通常会把⼀些常⽤的软件提前编译好, 做成软件包(可以理解成windows上的安装程序,包含了各种依赖)放在⼀个服务器上, 通过包管理器可以很⽅便的获取到这个编译好的软件包, 直接进⾏安装,软件包与包管理器之间我们可以理解为App和应用商店之间的关系。要知道我们下载的软件都是在远端的服务器上的,应用商店有执行搜索、下载安装的功能,非常的便捷方便。
我们知道,Linux是国外所创造的操作系统,那么对应的软件包服务器也在国外,由于一些限制,我们没法直接进行访问,那么该怎么办呢?国内很多公司以及高校提供了很多的Linux发行版的镜像,所谓的镜像,简单理解为完全拷贝到国内,这样我们在进行下载安装便不会受到阻碍
如果我们使用的是各类云服务器的话,它内置的配置文件已经把国外的软件源替换为了国内的镜像源,但如果使用的虚拟机的话我们需要手动更改对应的yum源或者是apt源。
这里博主使用的华为云的云服务器,所以yum的配置文件中已经替换为了华为自己的镜像源。
简单来说,我们在Linux下安装软件需要使用到yum或者apt这种包管理器工具,它们会根据对应的配置文件去寻找对应的服务器下载对应的软件。我们需要把这些配置文件切换为国内的镜像源才能正常的使用。云服务器在发行前自己已经切换了,而虚拟机则需要自己手动切换,这是清华大学的开源软件镜像站,感兴趣的可以了解一下。
1.2 yum的具体操作
那么我们该如何使用包管理器安装软件(这里用yum来演示)呢?下面来演示一下:
1.2.1 查找软件包
我们下载一个软件的前提是我们要知道下载什么软件,也就是说我们要知道软件的名字,通过 yum list
命令可以罗列出当前⼀共有哪些软件包。由于包的数⽬可能⾮常之多, 这⾥我们需要使⽤ grep
命令只筛选出我们关注的包.。例如我们想要安装一个叫做sl的软件:
在上图所示中第一列是软件的名字,第二列则分别对应主版本号.次版本号.源程序发行号-软件包的发行号.主机平台
"x86_64"
后缀表⽰64位系统的安装包, “i686” 后缀表⽰32位系统安装包. 选择包时要和系统匹配。"el7"
表⽰操作系统发⾏版的版本。 “el7” 表⽰的是 centos7/redhat7. “el6” 表⽰ centos6/redhat6。- 最后⼀列, base 表⽰的是 “软件源” 的名称, 类似于各类品牌的应用商店这样的概念。
1.2.2 安装软件
安装软件也就是把软件拷贝到指定的系统目录下,要修改系统目录,所以我们需要用到root账户或者使用sudo命令进行指令提权。那么让我们来安装一下sl,需要用到yum install
命令:
安装软件我们需要用到install
选项,-y
是强制安装,不加入该选项在安装时系统找到目标软件包时会再次询问你是否安装该软件,最后出现Complete!
则表示软件已经安装成功。
在Linux下我们安装的这些软件也就是可执行程序都在/user/bin目录下,下面我们来运行一个该程序,直接输入sl,和使用我们的指令一样,前面也讲过,所谓的各类指令就是可执行程序:
这是一个简单好玩的小程序,运行后会出现一辆小火车行驶而过。
在Linux中,我们安装了程序之后这些程序是在系统目录中的,所以每个用户都可以去使用,也就是说软件只需要安装一次都可以使用(除非是某个用户安装到自己的家目录中等情况)。
需要注意的是:yum/apt安装软件只能⼀个装完了再装另⼀个。正在yum/apt安装⼀个软件的过程中,如果再尝试⽤yum/apt安装另外⼀个软件,yum/apt会报错。
1.2.3 卸载软件
卸载软件需要用到的指令是yum remove
,例如:
与安装一样,可以添加-y
选项直接强制删除,不再询问,当出现Complete!
表示已经删除成功。
1.3 小结
使用yum命令的三板斧(需要使用root账号或者使用sudo进行指令提权):
- 查找:
yum list | grep name
。(apt中查找需要使用apt search
命令) - 安装:
yum install [-y] name
。 - 卸载:
yum remove [-y] name
。
在使用包管理器时需要保证主站网络畅通。这是一个包含各种有意思的小程序网站,感兴趣的可以了解一下。
软件源有标准源和扩展源之分,我们可以理解为打游戏时的正式服和体验服,一个是稳定的,而另一个则是新出的还并不稳定,处于测试阶段。我们可以安装扩展源去体验一些软件,使用sudo yum install -y epel-release
命令就可以安装扩展源。像上面我们演示的sl就是在扩展软件源中的。
2. 编辑器vim
在Linux中我们最常见编写代码的工具就是编辑器vim,它支持多模式编写。它是系统中自带的编辑器。
2.1 vim的基本概念和操作
首先,vim一共拥有14种模式:七种基本模式和七种额外模式(seven BASIC modes and seven ADDITIONAL modes)。不过我们最常用的模式只有三种,只需要掌握好这三种模式便可以熟练的使用vim,它们分别是:命令模式、插入模式、末行模式,各模式的功能区分如下:
- 命令模式(command mode):控制屏幕光标的移动,字符、字或⾏的删除,移动复制某区段及进⼊Insert mode下,或者到 last line mode。
- 插入模式(Insert mode ):只有在Insert mode下,才可以做⽂字输⼊,按「ESC」键可回到命令⾏模式。该模式是我们后⾯⽤的最频繁的编辑模式。
- 末行模式(last line mode ):⽂件保存或退出,也可以进⾏⽂件替换,找字符串,列出⾏号等操作。
模式之间可以进行切换。打开vim编辑器我们默认所在的模式为命令模式。
如果要查看你的所有模式:打开 vim,在底⾏模式中直接输⼊help vim-modes
即可查看。
我们用vim打开一个文件,使用命令vim filename
,若是打开一个不存在的文件在我们保存退出后会自动创建该文件:
进入之后默认处于命令模式:
我们需要切换到插入模式才能够输入文字,进行编写。从命令模式切换到插入模式有三种办法,分别是按下a、i、o键:
- a键:进⼊插⼊模式后,是从⽬前光标所在位置的下⼀个位置开始输⼊⽂字;
- i键: 进⼊插⼊模式后,从光标当前位置开始输⼊⽂字;
- o键:进⼊插⼊模式后,在光标所在行下插⼊新的⼀⾏,从⾏⾸开始输⼊⽂字;
不论在哪种模式下,我们要想回到命名模式,只需要无脑按Esc键即可。想要退出vim编辑器,需要进入末行模式输入:
w
(保存当前⽂件)wq
(输⼊「wq」,存盘并退出vim)q!
(输⼊q!,不存盘强制退出vim)
2.2 命令模式的命令集
对于插入模式来说就是正常的编写,不会涉及到各种命令,同时,我们在插入模式中编写时也没办法进行复制粘贴等操作,这些操作必须在命令模式中输入内容当作命令的方式来进行,可以理解为命令模式中的命令就是在windows下那些我们所熟悉的快捷键。命令模式存在的意义就是为了提高编辑效率
光标定位
vim可以直接⽤键盘上的光标来上下左右移动,但正规的vim是⽤⼩写英⽂字⺟「h」、「j」、「k」、「l」
,分别控制光标左、下、上、右移⼀格
- gg:光标定位到文件第一行的行首
- num+gg:光标定位到num行的行首
- shift+g:光标定位到文件最后一行的行首
- num+shift+g:光标定位到num行的行首
- shift+4:光标定位到行尾
- shift+6:光标定位到行首
- w:光标以单词为单位向后移动(这里的单词指的是被vim当作一个独立块的单词,不是英语上的单词)
- b:光标以单词为单位向前移动
在我们打开vim的时候,我们可以通过vim+filename+num进入vim后光标直接定位到num行。对于光标的定位还有其他的各类命令,不过上面的命令已经可以满足我们的日常需求了。
其他命令
- yy:复制当前行
- num+yy:复制从当前行开始往下数num行
- p:粘贴到当前行的下一行
- num+pp:粘贴到当前行的下一行num次
- dd:剪切当前行
- num+dd:剪切从当前行开始往下数num行(也可以用作删除)
- x:删除光标之后的字符,包括光标(也可以批量化,前面加数字)
- shift+x:删除光标之前的字符(也可以批量化,前面加数字)
- shift+~:快速大小写切换
- r:小范围的文本替换。选中光标所在内容,输入要替换的字符(也可以批量化,前面加数字)
- u:撤销上一次操作
- ctrl+r:对u进行撤销(只要不退出vim,可以一直进行撤销)
- shift+zz:保存并退出vim
模式切换(常用的)
shift+;:进入末行模式
a、i、o:进入插入模式
shift+r:进入替换模式,进行批量化替换
ctrl+v:进入视图模式,进行批量化编辑(常用于注释代码和去注释)
hjkl移动光标+shift+i+//+Esc:批量化注释
hjkl移动光标+shift+d:批量化去注释
2.3 末⾏模式的命令集
在使⽤末⾏模式之前,请记住先按「ESC」键确定已经处于命令模式,再按shift+;
即可进⼊末⾏模式。
- set nu:列出行号
- num:跳转到文件的num行
- /+关键字:从文件开头开始查找字符,按n键一直往后查找
- ?+关键字:从文件末尾开始查找字符,按n键一直往前查找
- q:退出,如果⽆法离开vim,可以输入去
q!
强制离开vim。 - w:保存,一般配合q使用,
wq
,这样在退出的时候还可以保存⽂件。 - !+命令:在不退出vim的情况下执行命令行的命令
- vs+filename:进行分屏操作。切换光标
ctrl+ww
- %s+/a/b/g:把文件中所有的a替换为b
2.4 小结
在vim
对于vim的使用没有什么技巧,有的只是熟能生巧,只要大家熟练练习,就一定能够掌握vim。
在我们使用裸vim写代码时没有缩进、语法高亮等功能,会使我们写代码时很难受,我们可以通过更改vim的配置文件来使它符合我们的使用习惯。
在⽬录 /etc
下⾯,有个名为vimrc
的⽂件,这是系统中公共的vim配置⽂件,配置后对所有⽤⼾都有效。
⽽在每个⽤⼾的主⽬录下,都可以⾃⼰建⽴私有的配置⽂件,命名为:.vimrc
。用vim打开该文件,输入需要的配置选项即可,例如:
- 设置语法⾼亮: syntax on
- 显⽰⾏号: set nu
- 设置缩进的空格数为4: set shiftwidth=4
当然,如果你想使vim拥有更多的功能,可以选择安装插件来完善配置,这里不再详细介绍,感兴趣的朋友可以去网上搜索。
2.5 使用sudo指令(补)
在上一章我们讲解权限时提到如果要使用sudo命令那么我们的账户必须是在一个类似于白名单的文件中,接下来教大家如何添加到白名单中:
首先我们要切换到root账户,然后用vim打开/etc/sudoers
:
进入之后我们先切换到末行模式,查找关键字root
,如下图所示:
找到这里之后切换回命令模式,用yy复制该行,然后用p进行粘贴,之后进入插入模式将用户名改为你要加入的用户名,之后保存强制退出即可。这样我们对应的账户就可以使用sudo命令进行命令提权了。
3. 编译器gcc
gcc是Linux下编译C语言的工具,它只能编译以.c
为结尾的文件,它可以把文件编译成可执行程序:
3.1 gcc编译选项
格式:gcc [选项] 要编译的⽂件 [选项] [⽬标⽂件]
首先我们要知道编译一共分为四步,分别是:预处理、编译、汇编、链接。
第一个选项是确定我们要进行到哪一步,如果不加则直接编译成可执行程序,也就是四步全部执行,第二个选项一般为-o
,后面跟的是文件名,意味着生成指定文件名的文件。
3.1.1 预处理
预处理的主要目的是进行宏替换、去掉注释、条件编译、头文件展开等等。我们可以通过-E
选项进行程序翻译,一旦预处理做完就停下来,生成.i
文件:
.i
⽂件为已经过预处理的C原始程序。
3.1.2 编译
编译的主要目的是生成汇编代码,我们可以通过-S
选项进行程序翻译,当编译完成形成汇编就停下来,生成.s
文件:
在这个阶段中,gcc⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作,在检查⽆误后,gcc 把代码翻译成汇编语⾔。
3.1.3 汇编
汇编的主要目的是生成机器可识别码,汇编阶段是把编译阶段⽣成的.s
⽂件转成.o
⽂件,我们可以通过-c选项信息程序翻译,汇编完成就停下来,生成.o
文件:
这里我们生成的.o
文件被称为可重定位目标二进制文件,还不能执行。
3.1.4 链接
链接的目的是生成可执行文件或库文件。在成功编译后就进入了链接阶段。在当前阶段gcc我们只需要直接编译文件即可:
对于我们当前阶段来说gcc进行程序翻译的过程中我们需要对链接有一个认识。
3.2 动静态链接和动静态库
在我们的实际开发中,不可能将所有代码放在⼀个源⽂件中,所以会出现多个源⽂件,⽽且多个源⽂件之间不是独⽴的,⽽会存在多种依赖关系,如⼀个源⽂件可能要调⽤另⼀个源⽂件中定义的函数,但是每个源⽂件都是独⽴编译的,即每个*.c⽂件会形成⼀个*.o⽂件,为了满⾜前⾯说的依赖关系,则需要将这些源⽂件产⽣的⽬标⽂件进⾏链接,从⽽形成⼀个可以执⾏的程序。这个链接的过程就是静态链接。静态链接的缺点很明显:
- 浪费空间:因为每个可执⾏程序中对所有需要的⽬标⽂件都要有⼀份副本,所以如果多个程序对同⼀个⽬标⽂件都有依赖,如多个程序中都调⽤了printf()函数,则这多个程序中都含有printf.o,所以同⼀个⽬标⽂件都在内存存在多个副本;
- 更新⽐较困难:因为每当库函数的代码修改了,这个时候就需要重新进⾏编译链接形成可执⾏程序。但是静态链接的优点就是,在可执⾏程序中已经具备了所有执⾏程序所需要的任何东西,在执⾏的时候运⾏速度快。
动态链接的出现解决了静态链接中提到问题。动态链接的基本思想是把程序按照模块拆分成各个相对独⽴部分,在程序运⾏时才将它们链接在⼀起形成⼀个完整的程序,⽽不是像静态链接⼀样把所有程序模块都链接成⼀个单独的可执⾏⽂件。
动态链接其实远⽐静态链接要常⽤得多。⽐如我们查看下code
这个可执⾏程序依赖的动态库,会发现它就⽤到了⼀个c动态链接库:
ldd
命令⽤于打印程序或者库⽂件所依赖的共享库列表。
在这⾥涉及到⼀个重要的概念: 库
- 在我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,⽽没有定义函数的实现,那么是在哪⾥实“printf”函数的呢?
答案是系统把这些函数实现都被做到名为 libc.so.6
的库⽂件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径/usr/lib
下进⾏查找,也就是链接到 libc.so.6
库函数中去,这样就能实现函数“printf”了,⽽这也就是链接的作⽤
静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件⽐较⼤,但在运⾏时也就不再需要库⽂件了。其后缀名在Linux下⼀般为.a
,在windows下一般为.lib
动态库与之相反,在编译链接时并没有把库⽂件的代码加⼊到可执⾏⽂件中,⽽是在程序执⾏时由运⾏时链接⽂件加载库,这样可以节省系统的开销。动态库后缀在Linux下一般为.so
,在windows下一般为.dll
。如前⾯所述的 libc.so.6
就是动态库。
gcc 在编译时默认使⽤动态库进行动态链接,如果想要使用静态链接需要加入选项-static
。但是在Linux中一般只会存在动态库,静态库需要我们自己去进行下载,使用命令yum install glibc-static libstdc++-static -y
从上图中可以看出静态链接的文件是远大于动态链接的。但是动态库是共享的,不能丢失,一旦丢失所有依赖动态库的程序都会运行出错。而静态链接是把我们要的库方法实现直接拷贝到我们的可执行程序中,库文件哪怕丢失也不会影响我们的可执行程序。
尾声
本章讲解就到此结束了,若有纰漏或不足之处欢迎大家在评论区留言或者私信,同时也欢迎各位一起探讨学习。感谢您的观看!