在有了前面的基础知识后,我们现在基本能够使用Linux的相关基本操作了,但我们知道,没有工具我们是无法便捷地实现某些功能的,因此我们这篇内容来谈谈Linux中的工具。
一、软件包管理器yum
我们知道,我们要想获得一个软件,需要下载安装包并安装,其实Linux中各种工具就是一个个软件,需要我们下载安装才能使用。其中Linux的常见软件安装方式有1.yum/apt2.rpm安装包安装3.源码安装。我们先来看一下yum。一开始我们想获取软件都是通过源码安装,也就是先下载代码然后编译,但是太麻烦了,所以开发软件的人写了代码以后进行了编译,形成了软件包然后把他放在云服务器上供大家下载使用,那我们的服务器想下载得有下载工具啊,yum就是下载工具(类似于windows上的应用商店),下载后软件包就到我们的服务器上了。
那我们怎么用yum下载软件呢?语法:yum install 软件包名称(需要以root用户执行或提权),然后会弹出是否安装(y/n)输入y即可安装。也可以在install前或后加-y免去确认直接安装。如果卸载软件直接把install换成remove即可。
二、多模式编辑器vim
vim就相当于windows里的记事本,可以写东西,其有三种模式,命令,插入,底行。我们先创建一个.c文件并以root身份执行vim是如下画面(语法:vim 文件名)
此时刚进入的时候是命令模式,在此模式下我们输入的文字都会被看成命令,如果不是命令就会报错。同时我们也可以输入i切换到插入模式(可以正常写代码了)
想退回到命令模式按一下esc键即可,如果想切换到底行必须先从插入退回到命令然后shift+“:”,底行想切换到命令也只需按esc即可。此时再输入wq(底行模式)即可完成一次编写(退出vim)。
如果想显示行数,就切换到底行模式输入set nu即可。接下来我们来进入命令模式看看有哪些命令
三、vim中命令模式下的命令
1.光标所在行
复制(yy)粘贴(p)撤销命令(u)剪切(dd),也可以配合数字使用,比如5yy就是在光标所在行及下五行全部复制。
u:撤销命令 如果想取消撤销用ctrl+r,即对u的撤销。
2.光标快速定位
shift+g=G,光标定位到结尾
gg 定位到最开始
n+shift+g:定位到第n行
shift +4=$ 光标移动到行尾,shift+6=^光标移动到行头
x:光标所在位置逐字符删除,shift x:向前删除
shift ~:光标位置大小写切换
r+任意字符:把当前位置替换成目标字符。
在命令模式下按shift+r即可切换到替换模式,此时输入会覆盖之前位置的字符,esc即可退出。
查找字符的功能需要我们先切换到插入模式然后用/字符来查找位置。如果有多个就用n来切换不同的位置
vs:vim多窗口对比查看,光标之间的移动我们用ctrl+ww。用法为vs+文件名。
四、vim的第四种模式
假设我们现在写完了代码并想注释一下,但我们如果像windows一样一行行的去注释太浪费时间了,所以第四种模式就是用于批量化操作,在vim中按ctrl+v即可切换模式(visual block)。
对于注释,首先切换模式,然后用hjkl(上下左右)光标定位你要操作的行和列,然后shift+i,输入//然后按esc即可。
对于去注释,我们还是切换模式,定位光标,然后按d即可删除。
五、vim的配置
我们在一开始使用的vim中是没有任何其他附带功能的(比如vim文件自动显示行数等),需要我们进入底行模式手动写入命令才能实现,但实际上我们可以自己配置,使其刚使用就有一些新的功能,我们需要在用户的家目录中找到一个.vimrc的文件并vim它,进去以后我们就可以把想带入的功能的命令写进去了(最好是普通用户下配置),但当我们切换到其他用户时就会发现又没有了,所以配置vim只是为了我们自己方便即可。
六、普通用户的命令提权
我们在之前讲过,我如果想以普通用户的身份执行root的命令,那么我需要在白名单内才可以使用sudo,那如何把我的账号添加进去呢?首先需要我们切换到root,然后找到/etc/sudoers的文件夹并用vim打开,
找到第100行这个代码然后cv一份,把root的名字改成你的就可以了。
七、gcc
gcc怎么用呢?假设我们现在用vim编写了一段代码,退出后用gcc 文件名即可对这个文件进行编译了,完成后会在当前目录下生成一个a.out的可执行程序,我们用./a.out即可执行该程序了。
此外,我们还可以对生成的程序任意命名,操作为gcc -o 重命名 要编译的文件(或gcc 要编译的文件 -o 重命名)
八、动态库与静态库
我们知道,一个程序想执行,需要经过预处理、编译、汇编、链接。其中我们刚才的gcc -o选项就是直接使其完成所有的过程,当然不同的选项也可以使其进行到不同的阶段,其中在链接的过程中,我们通过c语言知道,是代码和那些函数库进行链接,比如我们想使用printf函数就需要引入stdio.h。那么在Linux中我们也有对应的函数库,其中有动态库和静态库。动态库在Linux中通常以.so结尾。在windows中以.dll结尾。静态库.a(linux),.lib(windows)。
那动态库静态库与链接有什么关系呢?
比如我有一个可执行程序想在某操作系统上运行,此时我需要一个编译器,但是我只有编译器的话,有一些函数如果我没有自己定义和声明是无法成功运行的,此时,我需要去动态库中寻找这些函数的定义与声明使我的程序能够成功运行。这个过程就是动态链接(编译器告诉程序要去动态库中寻找函数)。
那静态链接就是把库中的函数实现拷贝到可执行程序中并使用,动态链接记住的仅仅是函数的地址。
动态库比较节省资源,可执行的程序体积小,但同时也有缺点,一旦动态库缺失,所有程序都无法运行。静态库虽然体积较大,但其不依赖其他库,即使丢失也无所谓,程序都能运行。
那我们如何查看一个文件是静态链接还是动态链接呢?我们可以使用命令file 文件,如果出现dynamically linked就是动态链接,statically linked就是静态。同时我们也可以用指令让文件以静态链接的方式运行,即gcc -o 重命名文件 原文件 -static。 此外,gcc默认都是动态链,如果要求gcc必须进行静态链接就用上面的指令。但如果我们直接使用这个指令会报错,是因为云服务器没有安装c/c++的静态库,需要我们手动安装(yum install -y glibc-static,普通用户需提权)