前言
Linux是一款类Unix系统,它诞生于1991年,由林纳斯.托瓦斯发明,不同于windows的图形界面,linux更多的使用的是命令行,所以与windows相比Linux操作系统会更加高效,安全.本文为Linux的初始阶段,文章内容包括Linux操作系统中的一些概念;针对目录,针对文件,针对时间以及权限等等的一些命令操作;以及Linux中的一些常用工具(vim,gcc,gdb,Makefile)的介绍
Linux的一些基本操作
Linux的目录及文件概念
Linux中一切皆文件,普通文件是文件,设备是文件,套接字也是文件,包括目录,我们也可以认为它就是文件。因为虽然他们的类型虽然不同,但是对他们提供的确实同一套操作界面。
对Linux和windows下的目录进行比较:
Linux不同于Windows的目录表示方式,他没有磁盘分区的概念,Linux中只有目录的概念且只有一个根目录,整个系统文件是一个树形结构,从根目录开始分支向下蔓延
‘/’在Linux中表示根目录。
在Linux中,除根目录(root)以外,所有文件和目录都包含在相应的目录文件中。Linux文件系统采用链接的树形目录结构,即只有一个根目录,其中含有下级子目录或文件的信息;子目录中又可含更下级的子目录或者文件的信息。这样一层一层的延伸下去,构成棵倒置的数
‘/’在windows中也表示根目录,但此跟目录非彼根目录。
windows对磁盘分区后会有多个磁盘,通常系统会装在C盘。windows有多个磁盘所以就会有‘多个根目录’,在dos命令模式下,在D盘的某文件夹中输入‘cd /’命令回车后会直接回到D盘的根目录。其它磁盘下也会回到该磁盘的目录。在哪个磁盘下使用‘/’,它就表示哪个磁盘的根目录。
Linux中挂载的概念:
Linux系统中是没有盘符的,所有的命令都是用目录的形式进行管理,把某一个分区和某一个目录对应。那么,我们对这个目录的操作就是对这个分区的操作。这样就实现了硬件管理手段和软件目录管理手段的统一,比如D盘分区和Linux系统中目录/test—绑定的过程就叫做Linux系统中的挂载
Linux根目录下的部分子目录的含义
/bin: 重要的二进制应用程序
/boot: 启动配置文件
/dev: 设备文件
/etc: 配置文件,启动脚本等,包含所有程序所需的配置文件,也包含了用于启动/停止单个程序的启动和关闭shell脚本
/home: 本地用户主目录,所有用户用home目录来存储他们的个人档案
/lib: 系统库文件,包含支持于/bin和/sbin下的二进制文件的库文件
/lost+found: 在根目录下提供一个遗失+查找系统
/mnt: 挂载文件系统
/tmp: 临时文件
针对目录的操作
1.ls :列出当前目录下的内容(查看当前文件夹下面有哪些文件)
-a: 查看所有文件,包括隐藏文件(查看目录下文件,并且不忽略以点开头的文件,linux中以”·”开头的文件是隐藏文件)
-l: 显示文件的长信息(即查看文件的详细信息) 淡蓝色显示的都是文件夹即目录
-S(大写): 按文件大小进行排序
-r: 按原先的排序进行逆序显示
-t: 按时间排序(最后一次修改时间)
2.pwd :显示当前所在路径(绝对路径)
绝对路径:以根目录为起始查找路径的路径叫做绝对路径
相对路径:以当前路径为起始查找路径的路径叫做绝对路径
3.mkdir : 创建目录
例如我们在根目录下的tmp文件夹里创建一个adc文件夹则输入命令: mkdir tmp/adc/
递归创建文件夹: mkdir -p tmp/abc 此命令可以从外到内递归创建文件夹
4.rmdir: 删除空目录(目录里面没有文件才可以删除)
例如我们将根目录下的tmp文件夹中的空文件夹adc删除: rmdir tmp/adc/ 之前的adc文件夹便不在了
rmdir -p test/abc/ 递归删除(从内往外判断是否为空,递归删除空目录) 假如abc为空,则删除abc,然后到test,如果test也为空则也删除test
注意:
不同访问权限的切换指令: su admin(用户名) /su root(root权限)
如果想在根目录下创建或者删除文件,我们必须取得root权限,否则是无法在根目录下创建新的目录的,执意创建系统会报错,root权限的切换以及目录的创建如下图:
(递归创建,删除,递归删除都同理可以进行)
5.cd: 改变当前所在路径(进入指定目录)
例如我们执行如下路径: / -> /home -> /admin -> /workspace
cd - 返回上一次所在路径
cd ~ 返回当前用户的家目录(每个用户都不同)
图解:
6.rm :删除文件(rmdir只能删除空的目录,而rm可以删除任意文件或目录)
-r 递归删除目录中的所有文件以及目录本身
-f 忽略提示信息删除文件(rm -rf test/ root用户时要慎重)
/rf /* (只能root用户使用)
7.cp: 复制文件
-r 递归拷贝目录
-f 忽略提示信息
例如在如下路径 /etc/passwd中有如下内容,我们的目标是将这些内容拷贝到/home/admin/workspace/command/passwd
原文件内容:
拷贝后目标文件内容:
8.mv(相当于剪切,先删除在粘贴): 将一个文件/目录移动到指定的目录下(对文件/目录改名)
-i 增加提示信息
例如此段指令:即将在workspace目录下的文件hello.txt移动到command下,如下:
针对文件的操作
9.stat: 用于显示文件的状态信息.stat命令的输出信息比ls命令的输出信息要更详细
10.cat: 打印文件内容到显示终端
-n : 每一行带有行号
11.tac: 按行对文件进行逆序打印按行显示到终端(把文件内容按行逆序打印)
12.less :对文件内容进行分页显示
f 空格 pgdown 向下翻页
b pgup 向上翻页
j k 上下箭头 上下按行移动
/string 向下匹配string字符串
?string 向上匹配string字符串
n 继续匹配下一处位置
q 退出
13.head 显示文件的前n行内容,默认是10行
-n 2 用于指定显示文件前2行
14.tail(和head用法基本相同) 显示文件的末尾n行内容,默认是10行
-n 2 用于指定显示文件末尾2行
-f 动态刷新文件末尾数据
ctrl+c 中断当前操作
15.touch: 若文件不存在则创建,存在则刷新原文件的时间属性(经常用于刷新时间属性)
他可以以一个文件为标准刷新其他文件的时间属性
例如: 以abc.txt为标准修改passwd的时间:touch -r abc.txt passwd
-t [[CC]YY]MMDDhhmm[.ss]
世纪 年月日秒
-d "2004-02-29 16:42:12"
刷新的是最后一次访问和修改时间
一个文件的时间属性有:
最后一次访问时间
最后一次修改时间
最后一次状态改变时间
16.标准输出重定向 >>/> : 把原本要输出到屏幕的内容输出到指定的文件里
:如上所示将本来要打印在显示终端的字符串”haha”重定向输出到了指定的文件夹passwd中.采用尾部显示的方法我们便能看到内容
注意:在上述操作过程中如果没有passwd这个文件,则会自己创建一个新的文件并将指定内容重定向入指定文件夹.
此命令改变了数据流向(把原本流向显示器的内容流向指定文件),如果流向的文件夹本来就有数据,则他会在原有数据之后添加新数据
:不同于 >> 的是 >他在改变数据流向的同时,会清空数据原有内容,然后添加新的数据
压缩解压操作
17.zip: 压缩,将大文件变成小文件
例:zip hello.zip abc.txt hello.txt passwd
解释:zip后跟最终要压缩好的文件的名称 然后后面跟上需要压缩在一起的文件
结果:生成了一个hello.zip的压缩包,但之前压缩的文件还在这个文件夹里
18.unzip:解压
例:unzip hello.zip 便解压成功,压缩的文件就又出来了
19.gzip/gunzip 删除原文件并且压缩
注意:这个只能压缩单个文件夹,即不能将多个文件同时压缩到一个文件夹内
例:gzip abc.txt ->> abc.tar.gz
20.tar:打包命令,不对文件进行压缩,只是把很多文件合在一起变成一个大文件
-c 打包
-v 显示详细的打包信息
-z 打包/解包的同时进行gzip格式压缩
-j 打包/解包的同时进行bzip2格式压缩
-f 用于指定压缩包
打包文件实例:
解包文件实例:
以上其实都是压缩解压缩操作,只是处理的文件的格式不一样
针对时间的一些操作
21.date:查看系统时间
date +%s :显示时间戳
22.cal: 查看日历
-3: 显示三个月的日历信息
-y: 显示全年的日历信息
-j: 按一年的第n天来显示日历信息
bc: 类似于一个计算机 可以计算两个日期之间的天数
其他的一些关于cal的用法我们都可以通过查找手册来看如何使用(man cal)
其他的一些命令
23.echo: 用于在shell中打印shell变量的值,或者直接输出指定的字符串
24. ifconfig: 查看主机IP地址信息
25. man: 用于查看命令/函数手册
26. echo: 打印内容到显示终端上
27 su: 切换当前用户(但是不切换当前所在路径)
上一个用户在什么路径下,那么切换后还在这个路径下
28.grep:字符串匹配命令
基本命令格式: grep 具体命令 要查找的字符串 文件/目录
-i : 忽略大小进行匹配
-v : 反向匹配(匹配到的行不显示,显示没有匹配到的)
-R : 递归匹配,这个命令的目标是目录,对一个目录下的所有文件进行匹配
29.find:文件查找命令
基本格式: find 目录 查找方式
** 模糊查找(如果不知道文件的全名称就用模糊查找)
-name: 按名称查找
-type: 按类型查找(常见类型 -f -d)
-size: 按文件大小查找 (“+”是在以上,”-“是在以内)
例如分别查找大小在10M以上的文件和在1k以下的文件
还可以按照如下方式查找
最后一次修改 最后一次状态改变 最后一次访问
按天查找 -atime -ctime -mtime(+/-n)
按分钟查找 -amin -cmin -mmin(+/-n)
30.关机/重启命令
关机: halt(shutdown -h now 关机)
重启: reboot
涉及权限的命令
31.umask: 查看/设置文件默认创建权限掩码
①设置文件的默认创建权限
②命令行创建的文件,创建出来的文件权限是掩码的反码
我们看到,在我的系统中,umask的默认值是002.那么002是个什么意思?
002即是系统文件默认创建权限掩码,而在命令行创建出来的文件权限是掩码的反码,即当掩码为002时,其实创建出来的文件的权限为775;
我们可以试着将掩码修改为022,再次创建一个目录和一个文件,会发现,此时创建出来的文件或目录的权限都已经改变为755;
由此可见,文件(目录)权限是和文件默认创建权限掩码有关的
umask -S : 查看各文件用户的权限
32.chmod:修改文件当前的权限
基本操作格式: chmod u(/g/o)+(/-)r(/w/x) 文件名
含义: 给所有者(/所属组/其他用户)添加(/删除)可读权限(/可写权限/可执行权限) 文件名
举例: 给所有者(user)在file.txt文件中添加一个可执行权限: chmod u+x file.txt
去掉所有者在该文件中的可执行权限:chmoe u-x file.txt
在这里chmod还有一种用法,叫做 粘滞位,什么是粘滞位,他又有什么用呢?:
粘滞位(Stickybit),或粘着位。最常见的用法在目录上设置粘滞位,如此以来,只有目录内文件的所有者或者root才可以删除或移动该文件。如果不为目录设置粘滞位,任何具有该目录写和执行权限的用户都可以删除和移动其中的文件。在我们系统中,粘滞位一般用于/tmp目录,以防止普通用户删除或移动其他用户的文件。
具体情况如下:
如何解决上面的这种问题呢,我们便要使用粘滞位,粘滞位的使用要主要只能针对目录,此处即temp
这样即使在权限为777的目录下,允许各用户在目录中任意写入,删除数据,但是禁止随意删除其他用户的数据
一定注意:粘滞位只能针对目录操作而不能针对文件操作
33.yum:软件管理包工具
yum list: 查看软件包列表
yum install software: 安装软件包
yum remove software: 移除软件包
34.sudu(在普通用户权限下):允许一个用户在任何地方执行任何指令
举个例子:
假如我们现在是普通用户的身份,但是我们想要做的事必须要获得root权限,但是频繁的切换root无疑十分的麻烦,所以我们就可以使用sudu指令,临时获得一个root的权限,去做我们想要做的事情.具体如图所示
以上就是一些linux的基础操作,他们都属于shell命令,下面来简要说一下Linux中的shell是什么以及他的运行原理
shell
shell翻译成壳的意思,它是包裹在linux内核外层的,一个可通过一系列的linux命令对操作系统发出相关指令的人机界面。 shell可以通过其条件语句和循环语句等,把一系列linux命令结合在一起,形成一个相当于面向过程的程序,shell script,来实现一些较为复杂的功能。
简而言之,shell是linux命令集的概称,是属于命令行的人机界面。
shell中有许多程序,较为典型的有bash和dash,我们当前使用的就是bash
Linux下的文件权限管理
Linux中的常用工具
vim编辑器
vim:
无法使用鼠标,鼠标的所有操作无效,除非后期添加一些插件
写入数据,复制,粘贴,剪切,选择输入位置
vim打开一个文件后有很多的模式(12种,这里只说一些常用的模式):
插入模式:写入数据
普通模式:无法写入数据,但是可以执行各项vim的操作指令(复制,粘贴,剪切…)
底行操作: shift+:
(如果不确定当前在什么模式下,多按几下ESC 一直退回普通模式就好
vim编辑器基本操作命令
1.vim 文件名 创建文件
2.vi 文件名 再次进入
3.普通模式->插入模式
i 从光标所在位置开始插入
a 光标向后移动一个字符的位置开始插入
o 在光标所在行下方添加一个新行开始插入
I 光标移动到行首开始插入
A 光标移动到行尾进行插入
O 在光标所在行上方添加一个新行开始插入
4.插入模式->普通模式
ESC
5.普通模式->底行模式
(一个冒号回到行底):
:w 保存
:q 退出
:wq 保存并推出
:q! 强制退出(不保存,还是上次退出时的样子)
:!pwd 临时执行一个外部的shell命令,回车返回
6.普通模式下的常用操作
移动光标:
hjkl 左下上右
w 向右移动一个单词
b 向左移动一个单词
0/$ 返回最前/返回最后
G 光标移动到文档的尾行
gg 光标移动到文档的首行
ctrl+f 向下翻页
ctrl+b 向上翻页
粘贴:
p(小) 向光标所在行的下方粘贴
P(大) 向光标所在行的上方粘贴
剪切(vim中删除就等于剪切)
dd 删除光标所在行
ndd 从光标所在行开始删除向下的n行数据
x 删除光标所在字符
dw 删除光标以后的一个单词
D 删除光标所在行,光标以后的数据
删除(vim中没有真正的删除,删除的数据都放到了剪切板中)
7.其他:
u: (撤销)后退到上一次操作
ctrl+r 前进到下一次操作
gcc编译器(编译C语言)
首先我们要了解一下一个程序为什么要编译?
当我们完成某个需求写好了一串代码交给计算机去执行并且看到结果.这其中过程其实还是比较复杂的.大致的过程我们可以理解为编译器将我们所写的C语言代码解释成机器可以识别的指令,然后机器根据这些指令生成相应的结果.而这个翻译的过程便是我们gcc需要去完成的.
gcc的编译过程
首先我们利用vim编译器编写一个文件名为homework.c的”hello world”小程序~
然后开始使用gcc编译器编译我们所写的这段代码
①预处理:生成.i的预处理文件
只激活预处理,不生成文件,需要把他重定向到一个新的文件
②编译:生成.s的编译文件
只激活预处理和编译,把文件编译成汇编代码
③汇编:生成.o的汇编文件
只激活预处理,编译和汇编,把程序做成obj文件
④链接:生成链接文件
激活预处理,编译,汇编和链接
以上便是gcc编译器对一个可执行程序操作的全过程,但这样一步一步的进行未免会有些繁琐,所以我们一般都是只执行最后一步链接,因为这一步就包含了预处理,编译以及汇编,如下为一般用法:
gcc总结
预处理: 展开所有代码,展开头文件…去掉注释..
编译: 实质就是一个纠错的过程,将C语言代码编译为汇编代码
汇编: 将汇编代码在解释成为机器代码
链接过程: 汇编之后将所有的文件和所依赖的库合在一起最终生成一个可执行程序.我们的代码经过汇编之后仅仅是将代码本身解释成为机器代码,但是我们代码中调用的函数(例如printf函数)并不知道到哪里实现.因此汇编后的代码是不完全的,所以也就不是一个完整的可执行程序,这时候就需要将printf所在的函数库链接起来
库文件:别人已经实现好的代码打包之后称为一个库,我们直接将库链接过来就可以使用库中已经实现的代码,而不需要我们重新实现)
汇编之后将所有的.o文件和所依赖的库合在一起最终生成一个可执行程序
但其实这里一个问题:如果在一个可执行程序中引用到了许多的库函数和重复的库函数,那么将这些函数库中的代码都链接过来则会造成一个情况:当多个程序运行起来,那么内存中将有非常多的重复代码,造成内存的拥挤,空间的浪费
为了解决这个问题,链接就产生了两种方式,动态链接和静态链接:
1.动态链接(节省资源,但对库的依赖程度高):不把库中的代码拿过来,而是仅仅记录一些代码的位置符号信息,在自己的代码中,运行的时候才会去找这段代码,生成的可执行程序比较小,但是,对库的依赖程度比较高,他链接的是动态库
2.静态链接(不节省资源,但对库的依赖程度低):直接将库中的所有代码拿过来写入到可执行程序中,这样生成的可执行程序比较大,但是对库的依赖程度低,他所链接的是静态库
gcc的默认链接方式为动态链接
一些命令
gcc编译一个程序: gcc homework.c(相当于链接,直接做了预处理,编译,汇编)
默认生成一个a.out这么一个可执行程序
我们想要执行这个可执行程序,那么就要告诉操作系用这个程序文件在哪个位置(eg: ./a.out)
gcc工具的常用选项
-o 用于指定要生成的文件名称(不一定是可执行程序)
-E 仅仅执行预处理操作
-S 仅仅执行到汇编操作完成,不会进行汇编及以后的操作
-c 仅仅执行到会变完成,不会进行后续的操作
以上便是gcc编译器的基本内容~
Makefile
什么是Makefile?
Makefile是一个不普通的普通文件,为什么这样说呢?首先,它是一个文本文件,同其他文本文件一样,我们可以在其中写入自己需要的内容,但是不同于其他的文本文件,我们需要写入的是一些编译规则,在Linux中有一个叫做make的命令,make执行的时候会去当前路径下找Makefile文件,按照这个普通的Makefile文本文件中写好的编译规则去完成整个项目的编译,也就是说Makefile仅仅是记录各种编译规则而已,实际是需要make程序来解释执行Makefile中记录的这些规则命令.makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具
举个简单的例子:
在上面我们用vim编写了一个文件名为homework.c的”hello world”程序,然后我们使用gcc对他进行预处理,生成了一个.i的文件;又对他进行编译,生成一个.s的文件;然后又对他进行汇编,生车给一个.o的文件;最后进行链接,生成了一个homework的可执行程序,这样一步一步的操作十分的繁琐,那么我们是否可以使用Makefile,将编译指令写入Makefile,然后make,让他自动运行我们想要的编译方式呢,答案是肯定的:
这便是Makefile的用处~
下面说说Makefile的具体使用方法
1.clean:清楚目标文件
每个Makefile文件中都应该写个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁.
一般格式:
gdb调试工具
像在windows下一样,在Linux中我们也可以对代码进行调试,这里就要用到我们的调试工具 gdb
具体调试步骤:
1.使用gcc的-g选项,重新编译我们的程序,向可执行程序中加入调试符号信息,只有这样我们才可以使用gdb调试程序,否则无法调试
gcc -g homework.c -o homework
2.gdb开始调试程序—将我们的程序加载到gdb中运行
gdb ./homework
gdb后直接运行后敲击
3.开始整个的调试过程
直接运行 --- 哪里错了改哪里
单步运行 --- 便于观察整个程序的运行逻辑
start 开始单步运行
l(n) 列出附近代码(n行)(默认5行)
name 下一步(不跟进函数)
s 下一步(跟进函数,进入函数内部),跟进的都是自己写的函数,不是库函数
until n 直接运行到第n行
b test.c:19 添加断点
i b 查看断点信息
r 直接运行程序
p v 打印变量v的内容
d 删除断点 例(gdb) d 3 d后面什么都不跟,则删除所有断点
bt 查看函数调用栈
c 继续运行
watch v 变量监控(当变量内容发生改变的时候停下来)
以上便是gdb的一些基本调试方法~