赞
踩
linux操作系统是类UNIX的操作系统,与Mac OS为同源操作系统,均来自UNIX
.
代表当前目录
..
代表上级目录
/
代表Linux操作系统的根目录
ls[选项][目录或文件]
列出目录下的所有子目录和文件,对于文件,列出其文件名以及其他信息
-l:罗列详细信息,通过首字母查看类型,其中"-"代表普通文件,"d"代表文件夹,“l”代表软链接文件
-a:隐藏文件(以“.”开头的文件)
-al:隐藏文件与详细信息都罗列
-lrt:对文件按时间排序,最新的放在最下面
pwd命令
显示用户当前所在的目录
cd[dir]命令
切换到输入的dir路径
绝对路径:一定以根目录开始
相对路径:相对某个文件目录开始,从某个文件夹开始计算路径
用户的家目录:用户登录到linux后,所在的路径.用下列语句可快速切换到家目录
- cd ~
- cd
~代表当前用户的家目录
若直接cd也可直接回到当前用户的家目录
linux是多用户的操作系统,管理员用户是root,普通用户名可以自己起,管理员用户权限相对更大
touch命令
touch + 文件名:新建一个不存在的文件
由下图可知,该文件以“-”开头,因此该文件是一个普通文件
在linux操作系统中并非以文件后缀区分文件类型
touch也可以创建源代码文件:touch 1.c或touch 2.cpp都可以
mkdir命令
mkdir + 文件夹名:创建文件夹
由上图可知,该文件类型为d,代表文件夹文件
可以一次性创建多个文件夹
可以嵌套创建文件夹,增加参数-p即可,如下
rm命令
删除文件或文件夹,不可逆,使用时需谨慎
删除文件:rm filename
批量删除时只需要在后面继续添加filename即可:rm filename1 filename2....
删除文件夹:rm -r [foldername]
-r:递归删除
如之前创建的多级目录linux,可用rm -r命令对其进行删除
-f:强制删除(包括只读文件(写保护)),若不希望删除时逐一确认,可增加-f选项,即直接删除,不会询问
-i:令其删除时进行逐一询问
rm *:相当于rm ./*, 删除当前目录下的所有,必须要分清在哪个文件夹下,不能再根目录下执行
rm -rf /*:代表从根目录开始删除所有,万万不能用
man命令
用于访问Linux手册页
可查询以下7个手册:
(1)普通命令
(2)系统调用
(3)库函数
(4)文件格式
(5)游戏定义
(6)附件以及一些遍历
(7)系统管理命令,只能由root用户使用
常用前两个,用于查找函数如何使用
可通过man + 手册号 + 函数名查询函数使用方法
cp命令
(1)拷贝文件
cp [源文件] [目标文件]:拷贝文件或文件夹
如下,将scott_data.sql拷贝到上级目录
(2)拷贝文件夹
cp -r 【源文件夹】 【目标文件夹】
cp命令还可以对文件进行重命名
eg:cp linux ../new_linux
会将linux拷贝到上级目录,且名称更改了,拷贝文件夹同理
mv命令
mv【源文件】【目标路径】:移动文件或文件夹,将源文件移动到目标文件路径下,可以用于重命名
echo+重定向
可将字符串重定向到文件中,若文件不存在则会创建一个
cat命令
cat+filename:查看文件内容,如上图中用cat查看hello文件的内容
cat -n 【filename】:在输出文件内容时显示文件行号
more命令
more【filename】用于查看文件内容,针对大文件有优势
按f向后翻页,b向前翻页,q推出,当翻页到最后自动推出程序
head命令
也用于查看文件内容,从文件头部开始,默认查看10行
-数字:显示n行
tail命令
查看文件内容,从尾部开始查看,默认10行
-f:循环读取文件内容,当文件内容改变时,会立即捕捉到
ctrl+c:可以结束一个命令或一个程序,也可终端当前命令的输入,可用此结束循环读取
注:ctrl+z在linux中不能结束程序
less命令
与more类似,分页显示
f:向后读取
b:向前读取
q:退出
不同的是当其到最后时不会自动退出
tar命令
tar压缩:tar -zcvf【压缩产生的压缩文件】.tar.gz【待压缩的文件或文件夹】
z:gzip压缩方式
c:创建压缩文件
v:展示压缩过程
f:指定产生的文件,一定要紧跟压缩产生的文件
tar解压缩:tar -zxvf【压缩产生的压缩文件】.tar.gz
x:解压缩
zip命令
zip压缩:zip【压缩产生的压缩文件】.zip 【待要压缩的文件或文件夹】
如果压缩的时文件夹,增加-r参数
zip解压缩:unzip【压缩产生的文件】.zip,默认解压到当前路径
unzip【压缩产生的压缩文件】.zip 【-d】【path】指定解压到path路径下
bz2命令
bz2压缩:tar -jcvf【压缩产生的压缩文件】.tar.bz【待压缩的文件或文件夹】
bz2解压缩:tar -jxvf 【压缩产生的压缩文件】.tar.bz
find命令
find 【path】 -name 【filename】查看path路径下的filename文件所在路径
grep命令
grep 【字符串】【目标源文件】在文件中查找字符串命令
-n:显示行号
-v:反向选择,即没有目标的行
history命令
查看历史执行过的命令
! + 历史命令编号可执行历命令
table:补全命令
可以在切换路径时,写长路径一次性切换
操作系统=操作系统内核+许多应用
操作系统内核:管理计算机的软硬件资源,本质是个软件
Shell的简单定义:命令行解释器,其中功能包括:
(1)将使用者的命令翻译给核心处理
(2)将核心的处理结果翻译给使用者
目前使用的命令行解释器:bash
当操作windows时,并非直接操作其内核,而是通过图形接口完成操作
shell对于linux有相同作用,主要对使用者指令进行解析,并将其传递给内核,再将内核的反馈结果通过shell解析给用户,shell作为使用者与内核之间沟通的桥梁存在
linux下主要分为超级用户与普通用户
用户之间的切换:
su - [用户名]:可以切换用户,且切换后路径变为切换用户的家目录下
su [用户名]:可以切换用户,路径不变
有些用户需要输入密码,输入密码时,并不会进行显示
通过命令行提示符可以区分是哪个用户
普通用户是$结尾
超级用户是#结尾
eg:
在使用普通用户时,可以直接用exit退出,回到root
eg:
ls-l的具体信息如图所示:
第1列为文件夹权限
第2列为硬链接数量
第3列为文件或文件夹的所有者
第4列为所属用户组
第5列为文件或文件夹大小
第6、7、8组合起来是文件最新的修改时间
第9列为文件或文件夹名称
以下对访问者权限进行解释:
权限实例:rwxrwxr-x
前3列rwx为文件所有者权限
中间3列rwx为所属组内用户针对该文件或文件夹的权限
最后3列r-x为针对其他用户的权限
所有者、组内用户、其他用户的关系类似于:宿舍中的一个人买了篮球,则这个人为所有者,同寝室的人为组内用户,其他寝室的人则是其他用户
权限分为:可读、可写、可执行
可读(r):是否能够查看文件内容
可写(w):是否可以向文件写入内容
可执行(x):是否拥有执行文件内容的权限
针对所有者、组内用户与其他用户的权限都是:是否可读、可写、可执行的权限
r--:只读
--x:仅可执行
-wx:可写可执行
rwx:可读可写可执行
-w-:仅可写
rw-:可读可写
r-x:可读可写
r-x:可读可执行
---:无权限
其中,r,w,x的位置都是固定的,分别在1、2、3号位置
r:八进制:4, 二进制100
w:八进制:2, 二进制010
x:八进制:1, 二进制001
rw:八进制6, 二进制110
rx:八进制5, 二进制101
wx:八进制3, 二进制011
rwx:八进制7, 二进制111
---:八进制0, 二进制000
分为针对所有者(u,user)、组内用户(g, group)、其他用户(o, other)的权限
如图所示,前三个rwx针对所有者,中间三个r-x针对组内用户,最后三个r-x针对其他用户
chmod:修改权限
chmod【u/g/o】【+/-】【r/w/x】【文件名称】, 分别给出了针对哪种用户、增加或减少权限、什么权限、文件名称
如果修改命令中不体现【u/g/o】,则针对3类用户都进行修改
chmod +[r/g/x] 文件名
chmod 【八进制数字】 【文件名】
如图,创建了一个文件,其权限如下图所示:
权限为:rw-r--r--
r:对于文件而言,具有读取文件内容的权限
如:当去除掉1.txt的所有者的r权限后, 对其的访问被拒绝,加回r权限后,可以被访问到
w:对于文件而言,具有是否能够修改文件内容的权限
如:当去除1.txt的所有者的w权限后,对其的写入被拒绝
x:是否具备执行文件的权限,是否能执行成功取决于文件的内容
对于可执行文件,通过./文件名来执行文件
如下所示,在没有x权限时执行会被拒绝,加上x权限后变为可执行,但其中内容无意义所以报错
可写入一个命令来查看是否能够执行:
创建一个文件夹,并在其下创建一个文件,向其中写入一些内容
由图可见,初始时test文件夹针对三类用户的权限为:rwxrwxr-x
r:决定用户能否查看文件夹下内容的作用
如下,当去除r权限,无法显示test下的文件
w:决定用户能否移动/删除文件夹下文件的权限
如下,当没有w权限后,无法将test下的1.txt移动到当前目录中 ,也无法对其删除
x:决定用户能否进入到文件夹
如下,当没有x权限后,无法用cd命令进入到test中
若其他用户也拥有w权限,可以删除所有者用户文件夹中的文件,这样不合理,因此需要给文件夹设置粘滞位。
设置了粘滞位后,该文件夹只能被以下用户删除文件:
(1)超级管理用户(root)
(2)该文件夹的所有者
(3)该文件的所有者
设置粘滞位的方式如下:
chmod +t [文件夹]
如下图,设置粘滞位后可以看到最后的可执行权限变为了t
前提:root用户才能创建普通用户
命令:useradd 【用户名】
修改用户密码:passwd 【用户名】
sudo:权限临时提升的一种方法
用用户配置到sudo file文件当中,用vim命令更改以下文件内容
/etc/sudoers
添加用户信息如下:
添加完毕后用source命令令其生效
添加完毕后,就可以使用sudo命令进行权限提升了
对于普通用户testuser,其查看root目录被拒绝,但可以通过sudo进行权限提升
chown【用户】【文件名】
chown -R 【用户】【文件夹名】递归更改
chgrp 【用户】【文件名】
chgrp -R 【用户】【文件夹名】递归更改
用于终止当前输入的命令
安装与移除软件
常用功能如下:
查询软件信息:yum list
由于yum list的结果很多,不方便查找,因此通常用管道进行过滤
yum list | grep "xxx"
三列分别代表:软件包名称、版本、开发者
安装软件:yum install 【-y】【包名称】,-y默认yes
移除软件:yum remove 【-y】【包名称】,-y默认yes
编辑代码
正常模式:vim 【filename】,该模式下不能输入
插入模式:按小写a进入插入模式,此时可以开始进行输入
底行模式(命令行模式):按“:”进入底行模式
退出vim需要在底行模式下输入wq进行保存退出,w为保存,q为退出,q!为强制退出,wq!为强制保存退出。
前提:在正常模式下
移删复替撤更跳
移(移动):移动光标
(1)上下左右键
(2)hjkl,h左移,j下移,k上移,l右移
(3)gg:光标回到文本开始
(4)G:光标回到文本末尾
(5)^:回到行首
(6)$:回到行尾
删(删除):删除内容
(1)x:删除光标所在字符
(2)[num] x:删除num个字符(包含光标)
(3)X:删除光标所在位置的前一个字符
(4)dd:删除一行的内容
(5)[num] dd:删除num行的内容
复(复制):复制并粘贴内容
(1)yy:复制当前光标所在行
(2)p:粘贴到光标所在行的下一行
(3)P:粘贴到光标所在行的上一行
(4)【num】yy:复制num行
替(替换):替换光标所在字符
(1)r:替换光标所在字符(一次替换一个)
(2)R:替换光标所到之处的字符(一次能够替换多个)
撤(撤销):撤销上一次的命令
(1)u:撤销上一次误操作的命令
(2)ctrl + r:反撤销
更(更改)
(1)cw:更改光标所在处的字到字尾处
(2)c【num】w:更改num个字
跳(跳跃):跳转到指定行
【num】G:跳转到第num行行首
为了令写代码时更加方便,需要安装该插件
能够在写代码时有代码提示、括号匹配、自动缩进、行号显示等。
下载方法,在希望使用vimforcpp的linux用户的家目录下执行:
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
需要输入用户密码
安装成功后,当前目录下会有隐藏文件:.vimrc,打开它,将51、52、53的2改为4即可
多行注释
(1)ctrl+v
(2)选择用注释的行,用hjkl选择
(3)shift+i进入插入模式
(4)输入注释符号
(5)按esc
多行去注释
(1)ctrl+v
(2)选择要删除的注释符号(用hjkl选择)
(3)按x删除
替换字符串(在底行模式/命令模式下进行替换)
(1)替换光标所在行首个目标字符串
命令:s/要替换谁/替换成什么/
(2)替换光标所在行所有的目标字符串
命令:s/要替换谁/替换成什么/g
(3)全文替换目标字符串
命令:%s/要替换谁/替换成什么/g
g:替换当前行所有
%:提示替换当前所有行
swp文件
在文件编译时,会产生swp文件,对于修改的内容会先写入swp文件中,若不及时删除,会在打开文件时报错,可直接将其删除。
将源代码编译成为可执行程序
gcc用于编译C,g++可编译C也可编译C++
预处理
编写以下程序
通过将其预处理得到.i文件,在文件最后的结果如下:
可见其中已经对其进行了宏替换、去注释,.i文件的其余内容为头文件展开
(1)宏替换,当进行宏定义时,最好加上括号
(2)头文件展开
(3)去注释
命令:
gcc/c++ -E test.c -o test.i
-E:告诉gcc/g++在编译程序时,只进行程序预处理,产生文件后缀为.i
编译
若代码中少写了“;”,在预处理阶段并不会报错,因为不进行语法语义检测
(1)语法和语义的检测
(2)源代码编译成为汇编指令
命令:
gcc/g++ -S test.c/test.i -o test.s
产生的.s文件中存放了汇编指令
汇编
将汇编指令转化为二进制代码(机器可识别代码)
命令:
gcc/g++ -c test.c/test.i/test.s -o test.o
产生.o文件,也被称为目标文件
链接
将若干二进制代码(.o)或库文件链接起来生成可执行程序
命令:
gcc/g++ test.o -o test
也可以直接一步到位,直接生成可执行文件:
gcc/g++ test.c -o test
区别:在于编译程序时,是否增加了-static,如果没有,则为动态编译,否则为静态编译
ldd命令可查看可执行程序依赖的文件:ldd 【filename】
eg:
动态库的后缀为.so
该程序还依赖了c运行时库:libc.so.6,包含了调用的若干函数的实现,如printf、strlen等
静态编译时,通过ldd命令无法查看其依赖的文件,因为在静态编译时,已经将依赖的函数实现都编译到可执行程序中。
二者的区别:
动态编译产生的可执行程序小,耗时小
静态编译产生的可执行程序大,耗时大(要将所有依赖的函数实现都编译到可执行程序中)
调试程序bug的工具
debug模式与release模式
linux下debug版本的程序在编译时需要增加-g命令行参数
通过gcc/g++编译出的默认是release模式
二者的区别:debug比release多了调试信息
gdb调试时一定是调试debug版本
对比二者调试时的不同:
release 版本,由图可知,没有调试信息
debug版本调试:
因此在调试可执行程序时必须用debug版本
gdb 【可执行程序】
l:查看源代码(从main函数开始)
也可以用 l + 函数名查看
r:运行程序
b [行号]:在某一行打断点
n(next):单步执行
s(step):逐语句,能够跳转到函数内部
c(continue):继续执行
info break:查看断点信息
其中的第一列--Num就是断点的序号
delete breakpoints:删除所有断点
delete breakpoint 【num】:删除断点序号为num的断点
disable breakpoints:禁用所有断点
disable breakpoint 【num】:禁用序号为n的断点
enable breakpoints:启用断点
p+变量名:打印变量的值,除了内置类型变量,还可以查看自定义类型(类、结构体)
info locals:查看当前栈局部变量的值
bt:展示调用堆栈,可通过调用堆栈来查询代码执行的函数调用关系,自底向上看
display 变量名:跟踪打印变量
undisplay:取消跟踪
(1)程序没有执行起来,调试可执行程序
(2)调试正在运行的程序
gdb attach 【pid】, pid是程序运行起来的进程号
(3)崩溃程序产生的coredump文件(核心转储文件)
coredump文件是程序崩溃瞬间内存的映像
程序崩溃主要原因:内存访问越界、解引用空指针、double free
执行命令:ulimit -a, 可以看到其中core file size,代表coredump允许的大小
因此,若想产生核心转储文件,需要更改core file size大小
利用 ulimit -c 大小或unlimited(无限)
利用解引用来造成程序崩溃
对其进行编译并运行,会发生段错误,结果如下,在当前目录产生了核心转储文件coredump
gdb 【可执行程序】【coredump文件】:进行调试
可对debug版本采用该方法对其coredump文件进行调试,所给信息比较详细,能够知道具体错误出现在何处
make与makefile可快速编译,产生可执行程序
make是个命令,是自动化构建项目的工具,make根据makefile的内容进行解析,编译程序
makefile是个文件,文件内容中包含了编译程序时的规则,
格式如下:
- 目标对象:依赖对象
- 编译命令
目标对象:要生成的可执行程序
依赖对象:生成可执行程序时依赖的源代码
编译命令:如何通过依赖对象生成目标对象
注:编译命令前的空格是一个tab
使用时利用“make”命令,会对makefile进行解析,从产生可执行文件
makefile中注释用#
(1)只为生成第一个目标对象而服务
如下,makefile中内容如下时,使用make命令只生成mytest
(2)如果为了生成第一个目标对象,需要先生成依赖对象,则在makefile文件中找生成依赖对象的方法
如下图,在获取test.s文件时,需要先获取test.i才行
则makefile中可写如下内容,生成test.s需要依赖test.i,因此会到下面寻找test.i的生成方式,通过第二个得到了test.i的生成方法,则先生成test.i再生成test.s
由此通过Make可以产生test.i进而产生test.s
(3)若依赖对象的最后一次修改时间小于目标对象的最后一次修改时间,则不生成
认为依赖对象是源代码,目标对象肯定是依赖于源代码生成的,而由于源代码没有更改,所以不生成新的目标对象
(1)内置变量
$^:所有依赖的对象
$@:目标对象
$<:代表第一个依赖对象
eg:
如图,利用依赖对象生成目标对象
若有多个依赖对象时,$^会囊括所有的依赖对象,仍会从中生成正确的可执行文件
(2)自定义变量
可以自己给变量起名字,用$来对其进行解析
如图,在执行make后,会产生release版本
makefile定义伪目标
用.PHONY修饰目标
伪目标总是被执行(之前如果是最新的版本则make不会产生新的文件,现在则总是执行)
makefile定义清理规则
图中,clean是自定义的名称
此时可通过make与make clean构建、删除可执行文件
若想一个makefile对多个文件进行同时编译,可按以下写法
all依赖test与test2,因此会去生成test和test2的生成方式,从而实现对两个都进行编译
代码的版本管理工具
将远端仓库克隆到本地
git clone xxx
此时将Project克隆到了本地中
git add 文件名:将没有被管理的文件进行管理
git commit -m 文件名:将文件令本地仓库管理
git push【分支名】
git pull
可查看仓库状态,若本地仓库与远端仓库信息不一致,会提示提交更改
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。