Linux-常用工具

本文详细介绍了Linux下的常用工具,包括软件包管理器yum,文件传输工具lrzsz,编辑器vim及其基本操作,C/C++编译器gcc/g++以及调试器gdb的使用,还有自动化构建工具make和makefile的原理及应用。此外,还提及了git的基本命令以及一些实用的Linux命令技巧。通过本文,读者可以对Linux开发环境有更深入的理解。
摘要由CSDN通过智能技术生成


linux下的常用工具

yum

在linux下安装一个软件一般有几种方式,1,直接下载源码,但是这样我们需要在linux下自己编译,而且有可能有些依赖文件我们没有下载导致编译错误。2,我们下载软件包,有人已经将源码编译完成,压缩成了软件包,我们直接下载软件包即可。yum就是一款软件包管理器。就像华为手机的应用商店一样,在yum可以下载软件。
使用的方法就是指令下载,

sudo yum list | grep '软件名字' #过滤出要下载的软件
sudo yum install 软件名字 #下载软件,可以使用-y选项免交互
sudo yum remove 软件名字 # 卸载软件

可以看到软件的安装与卸载必须使用root用户的权限才能完成。而且要注意的是,yum的下载必须一个一个的下载,如果你下载一个软件下载到一半再去下载另外的软件,就会失败。

lrzsz

lrzsz是用于windows和linux之间的文件传输。可以之间拖拽,也可以使用指令

rz  #receive 从windows传文件到linux
sz  #send 从linux传文件到windows

vim

vim是linux下的编辑器,有些大佬甚至认为vim是世界上最好的编辑器。vim的操作全是命令,全是要记的,但是我们只要记住主要的就ok。首先我们需要进入vim,
进入vim
在vim中我只介绍3种常用模式。普通模式,插入模式,命令行模式。我们第一次进入的就是普通模式,如果我们想输入内容,那么就需要转换成插入模式。转换方法多样,有i,a,o,不管大小写都是可以的,它们的区别就是光标的位置不同。具体可以大家下去实践。还有一点要注意的是,如果你想转换模式,只能先转换成普通模式,也就是说只能从普通模式装换成别的模式,再从别的模式转成普通模式。普通模式相当于一个中转站。别的模式转换成普通模式的方法就是esc键。普通模式转换成命令行模式的方法是shift+:,没错就是shift+冒号。
普通模式下的命令:
普通模式虽然不能想插入模式一样进行很自已的编辑,但是仍有很多快捷的命令。

  • 复制 && 删除

yy:复制光标所在行
n+yy:复制光标往下数n行的内容,(包括光标所在行共计n行)。
p:粘贴到光标所在行的下一行。
P:粘贴到光标所在行。
n+p或者n+P:粘贴n次。
dd:删除光标所在行。
n+dd:删除光标往下数n行的内容,(包括光标所在行共计n行)。

  • 光标定位

gg:光标定位到首行。
G:光标定位到尾行。
n+G:光标定位到第n行。
shift+4:光标定位到行尾。 锚点
shift+6:光标定位到行首。 锚点
w(word):光标向前移动一个单词的距离。
b(backword):向后移动一个单词的距离。
nb,nw :移动n个单词。

  • 别的操作

x or n+x:向后删除n个字符。
X or n+X:向前删除n个字符。
shift+~:将字符由大写变小写 or 由小写变大写。
h,j,k,l,左,下,上,右移动。(大佬都用这个。)
gg=G:代码自动对齐,(舒服啊这个功能)
u:撤销刚才的操作。
U or ctrl+r :反撤销。

当然,除了在普通模式下的命令,在命令行模式下,也有许多技巧。

  • 命令行模式下:
    输入 / 或者 ?,查找文本,按n或者N表示下一个。
    输入 set nu 表示调出行号。 set nonu,取消行号。
    输入 vs 文件名, 打开新文件,(多文件共页面)。
    多文件直接切换:ctrl+w, 然后 h or l
    或者直接 ctrl + 快速两次w。
  • 别的技巧 :

vim test.c +4 : #将光标直接定位到第四行。
!vim : 使用上一次的vim命令,(实际上大部分命令都可以使用感叹号+命令)
如果你的vim正在使用就退出而没有保存或者发生别的异常,那么系统可能会产生一个隐藏交换文件,你可以使用ls -a拿到交换文件,然后将其删除即可。

  • vim的配置

你可能会说vim不够人性化,不能进行补全或者自动对齐等,但是这也正是linux自由的体现!所有的功能都由你自己来配置。你只需再你的用户的工作目录下找到 .vimrc(root用户的在/etc/vimrc)这个隐藏文件,然后进行配置就行。具体的配置大家可以自行百度,找到适合自己的配置。最后的最后,贴上一个
vim从入门到精通

gcc 、g++

gcc是linux下的c语言编译器。用gcc编译c程序也很简单,比如我们有一个test.c的源文件。

gcc test.c -o test 

选项-o后面紧跟一个新的文件名,代表我们要将gcc生成的程序写入test这个文件中。比起VS编译器,gcc还可以帮助我们观察到c语言的翻译过程,即预处理,编译,汇编过程。

gcc -E test.c -o test.i # 执行到预处理
gcc -S test.i -o test.s # 执行到编译	
gcc -c test.s -o test.o # 执行到汇编
  • 动,静态库

从编译到可执行程序,还有最后一步要走,就是链接。将各种库与源文件链接起来。通常的链接方式有两种,动态链接和静态链接,而它们对应的库也叫做动态库或者静态库。那么,这两者有什么区别呢?库名的后缀不同,静态库后缀是.a,动态库是.so。你的文件在引入动态库时,只会给个链接,而引入静态库时会将静态库中所有的内容copy一份。这就会导致引入静态库生成的代码大小远大于引入动态库生成的代码。下面给大家演示一下,

#linux下查看文件或者库的命令
file test  # 查看文件属性
ldd test   # 查看跟文件相关的库

动,静态库
可以看到这些库后缀都是.so,实际上linux的c程序默认引入的库都是动态库。我们可以使用选项-static引入静态库。
引入静态库
我们可以明显的看到它们的大小相差很大。
g++是编译C++的编译器,用法跟gcc一样,只是把上面命令的gcc改成g++即可。
当然,gcc/g++还有大量的选项,比如-o0,-o1,-o2,-o3,表示编译器对程序的优化程度,-o0表示不优化,数字越大优化程度越大。-w表示编译的时候不生成警告信息,可以让编译器对语法的检查松一些,而-Wall则生成所有的警告信息。

gdb

gdb是linux下的调试器。我们只需要gdb+需要调试的文件名就可以进入gdb,但可能会出现下面这个问题,
gdb的问题
gdb提示你,没有发现调试符号。实际上我们的可执行程序分两个版本,dubug版本和release版本,debug版本的程序会在里面加上调试信息用来调试,而linux默认生成release的程序,而想要加上调试信息则需要在编译时加上-g选项。

gcc -g test.c -o test-d 

dubug
你会发现dubug版本比release版本的程序大一点,没错,这就是调试信息。如果你还不确定,那么你可以用readelf命令去检查debug的信息。
debug信息
test里面没有debug信息。gdb既然是linux下的程序,自然需要命令来操作。
q(quit):退出gdb。
list / list + 行号:列举出行号附近的所有行。按回车,会显示剩下的代码。可以缩写成l。

  • 断点相关

break+n(b + n):在第n行打上断点。
info b :查看所有断点。
delete breakpoint (d+编号):删除断点。(断点都会带上编号,删除要带上编号,否则就是删除所有断点。)
disable+编号:禁用断点。
enable+编号:启用断点。

  • 程序运行

run(r):运行程序到断点处,相当于VS下的F5,如果调试中途再run,那么从头开始调试。
start:运行程序,相当于在main函数处打断点+run。
step(s):逐语句,相当于VS下的F11.
next(n):逐过程,相当于VS下的F10.
continue(c):从一个断点调到另一个断点。
until+n:程序直接从当前行运行到第n行(如果第n行没有代码,那么往下寻找一行没有执行的代码停止)。
finish(f):跑完当前的函数然后停下来。
backtrace(bt):打开函数栈调用。

  • 监视变量
    p+变量:打印变量的值。
    display+变量/&变量:监视变量的值或者地址。
    undisplay+变量的编号:取消对应编号的变量监视。
    watch+变量:监视变量,如果变量发生变化则停下来。
    set var i = 100 :设置变量为特定的值。(没什么用)。

make,makefile

make是一条命令,而Makefile(makefile)是一个文件。这两者构成了我们的项目自动化构建工具。也许你对项目的自动化构建工具不太熟悉,因为我们平时使用的都是集成环境,比如在VS下创建项目,VS会自动帮助我们理清楚每个文件之间的关系,然后生成程序。而linux不行,你需要自己整合多个文件。下面是一个简单的Makefile文件:
Makefile
想一想,生成一个程序需要什么呢?Makefile为我们总结出两点:依赖关系,和依赖方法。我们想要一个test的可执行文件,我们需要依赖test.c这个源文件。这里的test我们称之为目标文件,而后面的文件称之为依赖文件。而test.c怎样生成test呢?没错,第二行告诉了我们方法。**注意的是,依赖方法开头不是几个空格,是键盘上的tab键。**上面是一个最简单的Makefile,下面的例子可以让你更清晰Makefile的工作原理。
例子2
make后,它会首先去观察第一个依赖关系,发现没有test.o文件,于是它会向下寻找是否有目标文件为test.o的依赖关系,注意的是,如果没找到,那么Makefile就不会往下执行了。找到第三行,然后发现没有test.s文件,然后继续找,知道找到test.c,是可以执行的,然后执行最后一行的依赖关系,再依次向上执行。
result
在VS下,如果你有印象的话,有一个文件清理,那么在Makefile中,我们也可以实现文件的清理。
伪目标
这里的clean是伪目标。什么意思呢?首先,clean没有依赖文件。其次,clean不会被变成一个文件。也就是说,当前目录下不会出现一个名字是clean的文件。.PHYON后面的目标有两个意思:1,常常是伪目标文件。2,目标总是被执行。这是什么意思呢?没错,.PHYON后面也可以跟我们的普通目标文件。
1
什么叫做目标总是被执行呢?如果你的test已经是最新的,你再运行make,那么你会收到提示:目标已经最新。但是clean这个目标可以总是被执行:
2
可以看到,make执行了一次后,就提示最新。但是make clean无论多少次都会被执行。

  • 多文件下的Makefile

Makefile的强大之处也体现在多文件上。
三个文件
如图,上面是一个简单的多文件项目。Add函数的声明在Add.h头文件中,实现在Add.c文件中,而test.c则调用了Add函数。而我们的Makefile编写如下:
多文件
只是依赖文件变多了,其他的规则也是不变。但是这又抛出一个问题:如果依赖文件有几万个,那么我难道要一个一个写上去吗?no,不需要。下面看Makefile的2.0版本。
2.0
其中的$ ^表示所有的依赖文件,$@表示目标文件。所以第二行代码实际上就是
gcc test.o Add.o -o test。实际上2.0的Makefile还仍有优化空间,如果你对代码的复用信手拈来,那么你对第3,4行和第5,6行这样的代码会很敏感:完全相同的形式,可以复用。下面是3.0版本的Makefile。
3.0

其中的两个%表示将该目录下的所有.c文件生成.o文件,而 $<表示第一个依赖文件,也就是.c文件。下面的*是通配符,没错,通配符也可以在Makefile中使用,表示所有以.o结束的文件。实际上,上面的代码只是为了演示一下Makefile的功能,Makefile实际上一步到位。
4.0
所有的语法上面的版本已经讲过,不做讲解。Makefile还可以定义变量。下面的究极版本:

cc=test
files=test.c Add.c
$(cc)=$(files)
	gcc $^ -o $@
.PHYON:clean
clean:
	rm -rf $(cc)

这个版本的Makefile没有用到任何的文件名字,好处是如果下面的执行出问题,只需要改动上面的变量即可,这有点像c中的typedef。上面的$符号表示取出变量所代表的值。

git

git是一款分布式版本控制工具。这篇博客只讲几个命令。

git clone #克隆仓库到本地
git add   #预添加代码
git commit -m “message” #将代码添加到本地仓库,选项一定要带
git push  # 将代码推送到远程仓库

琐碎的命令 或者 tips

ctrl+r:可以搜索曾经使用过的指令。
在gdb或者类似gdb的交互界面,如果打错命令,无法删除,按住ctrl再删除。
小技巧:> file :清空file文件,相当于将空白内容写入file。

进度条程序

先看一个小问题:

int main(){
	printf("hello world");
	sleep(5);
	return 0;
}

上面的代码会发生什么现象呢?程序先睡5秒,然后再输出hello world。这与我们的设想相反,难道程序不是从上往下执行的吗?答案是,程序就是从上往下执行的,但是printf输出到的是缓冲区,而我们想在屏幕上看见输出,需要刷新缓冲区。常见的刷新方法有换行符号,程序结束,强制刷新。由于上面三者都不具备,所有程序先printf写到缓冲区,然后睡5秒,最后程序结束刷新缓冲区。就是我们看到的现象。
问题2:
换行和回车有什么区别?
换行是直接换到下一行,不会回到开始的位置。
回车是回到本行开始的位置。
所有我们c中的换行实际上是换行+回车。
最后贴上一个有意思的进度条程序。
运行的结果:进度条
代码:
proc
(全文完)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值