linux基础

1 shell相关:

概念: shell就是命令解析器, shell将用户输入的命令解释成内核能够识别的指令;
shell就相当于翻译.
查看当前系统使用的shell:
echo $SHELL
当前系统支持的shell:
cat /etc/shells

2 linux目录结构:
是一个倒立的树状结构;
/bin: ls cp mv
/sbin: ifconfig halt shutdown
/lib: 库目录
/root: root用户的家目录
/dev: 字符设备和块设备. 在linux下, 一切皆是文件.
/home: 用户的家目录
/usr: 相当于windows的program files
/etc: 系统级别的配置文件
/mnt:
/media
/tmp
/opt

3: 相对路径和绝对路径

相对路径: 从当前目录开始表示的目录.
绝对路径: 从/目录开始表示的目录.

4 ls命令

ls -la
ls -ltr

5 touch file: 若file不存在,则创建一个空文件, 否则, 则更新文件的最后修改时间.

mkdir file:
mkdir dir:
mkdir -p aa/bb/cc
rmdir: 只能删除空目录
rm file: 删除文件
rm -r dir: 删除目录

6 cp命令: cp 源文件 目标文件

1 cp file1 file2 (不存在)
2 cp file1 file2 (存在) 
3 cp file dir(必须存在)
4 cp -r dir1 dir2(不存在)
5 cp -r dir1 dir2(存在)

cp -a file1 file2

7 mv命令: mv 源文件 目标文件

改名:
1 mv file1 file2(不存在)
2 mv file1 file2(存在)
3 mv dir1 dir2(不存在)

移动:
4 mv file dir (必须存在)
5 mv dir1 dir2(存在)

8 查看文件内容:

cat more less head tail
tail -f test.log: 实时显示文件内容
man xxx//查函数

9 软连接: 相当于windows下的快捷方式

ln -s 源文件 连接文件
注意点: 创建软连接源文件一定要使用绝对路径, 否则, 当软连接文件
移动位置之后, 就会找不到指向的文件了.

10 硬链接:

ln soucefile  desfile
硬链接不能建立在目录上
创建一个硬链接文件, 硬链接计数+1, 删除一个则-1;

ls -li: 可以查看文件的inode

作用: 
	1 可以起到同步文件的作用
	2 可以起到保护文件的作用

11 chmod

   	文字设定法: chmod ug+wx file.log
   	数字设定法: chmod 777  file.log

chown:
sudo chown mytest:mytest aa.log
sudo chown mytest.mytest aa.log
sudo chown :mytest aa.log
sudo chown .mytest aa.log

chgrp:
sudo chgrp mytest aa.log

12 find:查找文件,用于模糊查找

 -name:
 -type:
 -size
 -maxdepth/mindepth
 -ctime/atime/mtime
 
 find path -name "*.c" -exec shell命令 {} \;  
 find path -name "*.c" | xargs shell命令 		

13 grep:查找包含具体内容的文件

-r参数, 若是目录, 则可以递归搜索
-n参数可以显示该查找内容所在的行号
-i参数可以忽略大小写进行查找
-v参数不显示含有某字符串
搜索当前目录下包含hello world字符串的文件
grep -r -n “hello world” ./ ------显示行号
grep -r -i -n “HELLO world” ./ -------忽略大小小查找

find和grep结合使用:
find . -name “*.sh” | xargs grep -n “while”

写出命令查找宿主目录下文件大于100k小于10M的文件,
并将查到文件的详细信息保存到另一个文件file中。
find ~ -size +10M -size -20M | xargs ls -l > file

14 软件安装和卸载

在线安装
软件安装:sudo apt-get install 软件名
软件卸载:sudo apt-get remove 软件名
更新软件列表:sudo apt-get update
清理安装包:sudo apt-get clean
清理的是缓存路径:/var/cache/apt/archives
软件包安装
在Ubuntu系统下必须有deb格式的安装包
软件安装
sudo dpkg -i xxx.deb
软件卸载
sudo dpkg -r 软件名	

15 压缩和解压缩

tar -cvf my.tar file dir
tar -xvf my.tar -C mydir

tar -zcvf my.tar.gz file dir
tar -zxvf my.tar.gz -C mydir

tar -jcvf my.tar.bz2 file dir
tar -jxvf my.tar.bz2 -C mydir

zip:
zip -r xxx file dir
unzip:
unzip xxx.zip -d /home/itcast/test/

16 vim

Vi有三种基本工作模式: 命令模式、文本输入模式、末行模式。
三种工作模式的切换如图所示, 从下图中可以看出编辑模式和末行模式之间不能相互切换, 必须经过命令模式.
在这里插入图片描述

17 gcc

gcc编译器将c源文件到生成一个可执行程序,中间一共经历了四个步骤:
在这里插入图片描述
gcc的工作流程:
1 预处理: cpp预处理器, 去掉注释, 展开头文件, 宏替换
gcc -E test.c -o test.i
2 编译: gcc, 将源代码文件编译成汇编语言代码
gcc -S test.i -o test.s
3 汇编: as, 将汇编语言代码编译成了二进制文件(目标代码)
gcc -c test.s -o test.o
4 链接: ld, 链接test.c代码中调用的库函数
gcc -o test test.o
在这里插入图片描述

18 库

库是二进制文件, 是源代码文件的另一种表现形式, 是加了密的源代码;
是一些功能相近或者是相似的函数的集合体.
静态库可以认为是一些目标代码的集合, 是在可执行程序运行前就已经加入到执行码中, 成为执行程序的一部分. 按照习惯, 一般以.a做为文件后缀名.静态库的命名一般分为三个部分:
前缀:lib
库名称:自定义即可, 如test
后缀:.a
所以最终的静态库的名字应该为:libtest.a
静态库的制作:
1 将.c文件编译成.o文件
gcc -c fun1.c fun2.c
2 使用ar命令将.o文件打包成.a文件
ar rcs libtest1.a fun1.o fun2.o

静态库的使用:
1 main.c与head.h和libtest1.a在同一级目录的情况
gcc -o main1 main.c -I./ -L./ -ltest1
2 main.c与head.h和libtest1.a在不同一级目录的情况
gcc -o main1 main.c -I./include -L./lib -ltest1
优点:
函数库最终被打包到应用程序中,实现是函数本地化,寻址方便、速度快。
(库函数调用效率==自定义函数使用效率)
程序在运行时与函数库再无瓜葛,移植方便。
缺点:
消耗系统资源较大, 每个进程使用静态库都要复制一份, 无端浪费内存。
静态库会给程序的更新、部署和发布带来麻烦。如果静态库libxxx.a更新了,所有使用它的应用程序都需要重新编译、发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载)。

动态库
共享库在程序编译时并不会被连接到目标代码中, 而是在程序运行是才被载入. 不同的应用程序如果调用相同的库, 那么在内存里只需要有一份该共享库的拷贝, 规避了空间浪费问题.动态库在程序运行时才被载入, 也解决了静态库对程序的更新、部署和发布会带来麻烦. 用户只需要更新动态库即可, 增量更新. 为什么需要动态库, 其实也是静态库的特点导致.
按照习惯, 一般以”.so”做为文件后缀名. 共享库的命名一般分为三个部分:
前缀:lib
库名称:自己定义即可, 如test
后缀:.so
所以最终的静态库的名字应该为:libtest.so
动态库的制作:
1 将.c文件编译成.o文件
gcc -fpic -c fun1.c fun2.c
2 使用gcc将.o文件编译成库文件
gcc -shared fun1.o fun2.o -o libtest2.so

动态库的使用:
gcc -o main2 main.c -I./include -L./lib -ltest2

动态库文件在编译的时候, 连接器需要使用参数-L找到库文件所在的路径; 在执行的时候, 是加载器ldd根据动态库的路径进行加载的, 与编译的时候用的-L指定的路径无关.

最常用的解决办法:将LD_LIBRARY_PATH环境变量加到用户级别的配置文件~/.bashrc中, 然后生效(. ~/.bashrc source ~/.bashrc 退出终端然后再登录)

19 makefile

makefile文件中定义了一系列的规则来指定, 哪些文件需要先编译, 哪些文件需要后编译, 哪些文件需要重新编译, 甚至于进行更复杂的功能操作, 因为makefile就像一个Shell脚本一样, 其中也可以执行操作系统的命令. makefile带来的好处就是——“自动化编译”, 一旦写好, 只需要一个make命令, 整个工程完全自动编译, 极大的提高了软件开发的效率.
make是一个命令工具, 是一个解释makefile中指令的命令工具, 一般来说, 大多数的IDE都有这个命令, 比如:Visual C++的nmake, Linux下GNU的make. 可见, makefile都成为了一种在工程方面的编译方法.
makefile文件中会使用gcc编译器对源代码进行编译, 最终生成可执行文件或者是库文件.
makefile基本规则三要素:
目标: 要生成的目标文件
依赖: 目标文件由哪些文件生成
命令: 通过执行该命令由依赖文件生成目标

makefile有三种类型的变量:

  • 普通变量
  • 自带变量
  • 自动变量

普通变量
变量定义直接用 =
使用变量值用 $(变量名)
如:下面是变量的定义和使用
foo = abc // 定义变量并赋值
bar = $(foo) // 使用变量, $(变量名)
定义了两个变量: foo、bar, 其中bar的值是foo变量值的引用。

除了使用用户自定义变量, makefile中也提供了一些变量(变量名大写)供用户直接使用, 我们可以直接对其进行赋值:
CC = gcc #arm-linux-gcc
CPPFLAGS : C预处理的选项 -I
CFLAGS: C编译器的选项 -Wall -g -c
LDFLAGS : 链接器选项 -L -l

自动变量
$@: 表示规则中的目标
$<: 表示规则中的第一个条件
$^: 表示规则中的所有条件, 组成一个列表, 以空格隔开, 如果这个列表中有重复的项则消除重复项。
特别注意:自动变量只能在规则的命令中使用.

在这里插入图片描述
makefile中的函数有很多, 在这里给大家介绍两个最常用的。
1.wildcard – 查找指定目录下的指定类型的文件
src= ( w i l d c a r d ∗ . c ) / / 找到当前目录下所有后缀为 . c 的文件 , 赋值给 s r c 2. p a t s u b s t –匹配替换 o b j = (wildcard *.c) //找到当前目录下所有后缀为.c的文件,赋值给src 2.patsubst – 匹配替换 obj= (wildcard.c)//找到当前目录下所有后缀为.c的文件,赋值给src2.patsubst匹配替换obj=(patsubst %.c,%.o, ( s r c ) ) / / 把 s r c 变量里所有后缀为 . c 的文件替换成 . o 例:在 m a k e f i l e 中所有的函数都是有返回值的。当前目录下有 m a i n . c f u n 1. c f u n 2. c s u m . c s r c = (src)) //把src变量里所有后缀为.c的文件替换成.o 例: 在makefile中所有的函数都是有返回值的。 当前目录下有main.c fun1.c fun2.c sum.c src= (src))//src变量里所有后缀为.c的文件替换成.o例:在makefile中所有的函数都是有返回值的。当前目录下有main.cfun1.cfun2.csum.csrc=(wildcard *.c) 等价于src=main.c fun1.c fun2.c sum.c
obj=$(patsubst %.c,%.o, $(src))等价于obj=main.o fun1.o fun2.o sum.o
在这里插入图片描述
makefile的清理操作
用途: 清除编译生成的中间.o文件和最终目标文件
make clean 如果当前目录下有同名clean文件,则不执行clean对应的命令, 解决方案:
伪目标声明:
.PHONY:clean
声明目标为伪目标之后, makefile将不会检查该目标是否存在或者该目标是否需要更新
clean命令中的特殊符号:
“-”此条命令出错,make也会继续执行后续的命令。如:“-rm main.o”
rm -f: 强制执行, 比如若要删除的文件不存在使用-f不会报错
“@”不显示命令本身, 只显示结果。如:“@echo clean done”
其它
make 默认执行第一个出现的目标, 可通过make dest指定要执行的目标
make -f : -f执行一个makefile文件名称, 使用make执行指定的makefile: make -f mainmak
在这里插入图片描述

20 gdb

gdb是在程序运行的结果与预期不符合的时候, 可以使用gdb进行调试,特别注意的是: 使用gdb调试需要在编译的时候加-g参数.
gcc -g -c hello.c
gcc -o hello hello.o

启动gdb:
gdb program
set args hello world
show args
执行程序:
run//在第一个断点处停止
start//在第一条语句停止

list://查看源代码
list
list -
list func
list linenum
list file:func
list file:linenum
set listsize n//设置显示行数
show listsize

断点操作:
b linenum
b func
b file:linenum
b file:func
info b//查看断点信息,或者 i b
disable n m//设置断点n、m无效
disable m-n//设置断点m-n无效
enable m n | m-n//设置断点有效
delete m n | m-n //删除断点
条件断点:满足条件才设成断点
b test.c:8 if intValue == 5
调试命令:
run
start
next//单步跟踪,不会进入调用的函数体
step//单步跟踪,进入调用的函数体
finish
until//直接运行循环体
continue//继续运行程序, 可简写为c(若有断点则跳到下一个断点处)
print var//打印变量的值
ptype var//返回变量类型
set var i=8//将变量i设置为8
自动显示:
display var
info display
disable display m n | m-n
enable display m n | m-n
delete display m n | m-n
undisplay m n | m-n

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值