思维导图
Linux命令和shell命令区别
- Shell命令是一个更广泛的概念,包括:
-
- Shell内置命令(
cd
、pwd
、export
、source
、history
、export
)。 - 外部Linux命令(
ls
、cp
、mv
、rm
、chmod
、find
、ping
、cat
、apt
、dpkg
、uname
、lsp_releace
、echo
、wc
)。 - Shell脚本语法(如
if
、while
)。
- Shell内置命令(
- Linux命令特指:
在Linux系统中安装的独立可执行程序,需要通过Shell或脚本调用。
基本命令(复习)
ls :列出目录下内容(不包括隐藏文件)
ls -a :列出目录下所有文件包括隐藏文件
ls -l :显示当前目录下文件的详细信息(文件类型+属主权限+同组用户权限+用户权限)
ls -r :列出目录下所有文件不包括隐藏文件(反向排序输出)
cd:路径切换(shell内建)
cd / :进入根目录
cd ~ :进入用户主目录(就是家目录)
cd . :原地
cd .. :进入上级目录
cd - :进入上次访问目录
cd :返回家目录
touch
1.创建一个空文件(普通文件)
2.更新文件状态
mkdir&rmdir&rm
1.mkdir
mkdir filename
mkdir 路径/filename //创建一个空目录(路径必须存在)
mkdir -p +文件路径/filename //如果路径不存在会创建整个路径
2.rmdir
rmdir filenamee
rmdir 路径/filename //删除一个空目录
rmdir -p +文件路径/ //可以删除整个路径
3.rm
rm :删除文件或目录(不可恢复)
选项:
-f :强制删除
-i :询问删除
-r :删除目录(非空也可)
cp&mv
1.cp
1.cp :复制一个源文件到目标文件(夹)
cp 文件名 路径/filename
cp 文件名1 文件名2(原位置拷贝文件)
cp 文件名1 文件名2 +路径(两个文件一起拷贝到目标文件路径下) //可以复制多个文件
cp -r 文件名1 路径/文件名2(把文件复制到另一个路径下)
cp +*.c(拷贝所有相同类型文件)
-i :覆盖时询问(交互)
-r :可复制文件夹
2.mv
mv :对文件移动或改名字
-i :交互
mv 文件名1 文件名2(改名字)
mv 文件名 路径/文件名(移动文件到路径下并改名) //可以移动多个文件
chmod
chmod 数字 文件(夹):将文件设置为数字代表的权限
数字代表权限:r:4(读),w:2(写):,x:1(执行)
Linux命令
一.查看系统版本
(1)lsb_release -a或者-r(-a详细,-r简略)
(2)cat /etc/issue (查看文件中的内容)
二.查看内核版本
(1)uname -a或者-r
(2)cat /proc/version (在文件中查看)
三.更新源
(1)源文件地址:/etc/apt/sources.list
(2)更新软件源:sudo apt-get update
第一步:先复制一份以防万一:sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
第二步:打开修改:sudo vi /ets/apt/sources.list
第三步:更新软件源
四.系统维护命令
1.查看man手册
man man
2.查看磁盘空间
df -Th 或者 df -h
3.本身不是系统维护命令,但是操作时会使用到的其他命名
date:查看当前系统日期
clear:清屏
echo:向终端输出内容
五.用户管理命令
1.新建用户
sudo adduser
2.切换用户
su 用户名
注:不加用户名默认切换到root用户(超级管理员账户)
3.修改用户密码
sudo passwd(更新当前用户密码)
4.给用户添加管理员权限
(1).先进入root超级管理员账户
su root
(2).打开用户权限文档/etc/sudoers
vi etc/sudoers
(3).修改文档
用户名 ALL=(ALL:ALL) ALL
5.删除用户
(1). 检查用户是否存在
id username //确认用户存在
(2). 终止用户所有进程
(1)查找用户进程:
ps -u username
(2)终止用户进程:
sudo killall -u username //终止所有进程
sudo pkill -u username //另一种方式
(3). 删除用户及其主目录
sudo deluser 用户名 //删除用户的同时,不会删除用户主目录
sudo deluser --remove-home用户名 //删除用户的同时,删除用户主目录
sudo userdel -r 用户名 //删除用户的同时,删除用户主目录
sudo userdel -rf 用户名 //强制删除
(4). 验证删除结果
id username //应提示“无此用户”
ls /home //确认主目录已删除(若使用 `-r` 选项)
六.进程管理命令
1.查看进程状态
(1).ps -aux //查看所有用户所有进程
使用场景:快速查看进程的资源占用情况
USER(用户) PID(进程id) %CPU %MEM VSZ RSS TTY(是否依赖终端 ?是不依赖) STAT(状态) START TIME COMMAND
(2).ps -ef //(-e 所有进程,-f 完整格式)
使用场景:查看进程的父子关系和启动时间
UID PID PPID C STIME TTY TIME CMD
(3).ps -ajx
适用场景:适合需要同时查看进程关系和资源占用的场景。
PPID PID PGID(组id) SID(会话id) TTY TPGID STAT UID TIME COMMAND
(4).man ps //查看进程状态的信息
(5).常见状态
R Running(运行中):进程正在 CPU 上运行或可运行(在运行队列中等待调度)。
S Sleeping(可中断睡眠):进程正在等待某个事件(如 I/O 操作完成),可被信号唤醒。
D Uninterruptible Sleep(不可中断睡眠):进程正在等待 I/O 操作(如磁盘读写),不可被信号唤醒。通常与硬件交互相关。
T Stopped(已停止):进程被暂停(如通过 Ctrl+Z 或 SIGSTOP 信号)。
t Tracing Stop(跟踪停止):进程被调试器(如 strace 或 gdb)暂停。
Z Zombie(僵尸进程):进程已终止,但其父进程尚未调用 wait() 回收其退出状态。
X Dead(已死亡):进程已终止,但尚未被系统完全清理(罕见状态)。
< 高优先级进程:进程的优先级较高(nice 值为负数)。
N 低优先级进程:进程的优先级较低(nice 值为正数)。
L 内存锁定:进程的部分或全部内存被锁定在物理内存中(防止被交换到磁盘)。
I 表示进程为空闲的内核线程。这类线程通常由内核创建,用于执行特定任务,且在空闲时不会占用CPU资源。
s 会话领导者:进程是会话的领导者(如终端的 shell)。
l 多线程进程:进程是多线程的(ps 命令中通常不单独显示,但可能与其他状态组合)。
+ 前台进程组:进程属于前台进程组(通常与终端关联)。
(6).处理前后台运行进程
./a.out & //将a.out在后台运行
fg 编号 //将后台运行进程拉到前台运行
ctrl z //将前台运行进程拉到后台运行并且暂停
bg 编号 //将后台进程暂停运行
2.top动态显示进程状态
PR表示进程的优先级
NI是用来调整进程优先级的参数,取值范围:-20~19
普通进程:PR=20+NI
实时进程:NI无效
3.修改正在运行的进程的优先级
sudo renice -n num PID //修改NI值
4.nice定制运行的优先级
sudo nice -n num ./可执行文件
5.使用kill给进程发送信号
常用信号:
Kill -9 PID //杀死进程
Kill -19 PID //暂停进程
七.文件系统命令
(1)文件系统类型:磁盘文件系统;网络文件系统;专有/虚拟文件系统
(2)Linux文件:
/bin:存放系统中最常用的可执行文件
/dev:存放所有设备文件,包括硬盘、分区、键盘、鼠标、USB、tty等
/home:用户主目录的默认位置
/mnt:该目录通常用于作为被挂载的文件系统的挂载点
/usr:用于存放与系统用户直接有关的文件和目录,例如应用程序及支持它们的库文件
(3)文件操作相关命令
1.查看文件属性
查看文件属性
file 文件名
2.将文件内容输出到终端
cat 文件名
cat -n 文件名 //显示行号
3.查找文件
find 路径 -name "文件名" //引号可加可不加
4.查询指定字符串
grep "字符串" 文件名 //在文件中查找指定字符串;引号可加可不加
grep "字符串" -nR //从当前路径开始查找,找到所有用过这个字符的文件
5.删除文件
rm -f 文件名 //-f强制删除
rm -rf 目录名 //-r对目录操作
6.输出文件前几行
head 文件名 //默认删除10行
head -num 文件名字 //输出num行
7.输出文件后几行
tail 文件名 //默认输出文件后10行
tail -num 文件名 //输出文件后num行
head -15 文件名 | tail -5 //输出文件前15行的后5行
八.软链接和硬链接
1.硬链接:
存储内容 直接指向文件的 inode
原文件删除 仍可通过硬链接访问文件内容,直至所有硬链接被删除
文件大小 与原文件相同(共享数据块,不额外占用空间)
inode 号 与原文件 inode 相同
更新行为 始终有效(因直接绑定 inode)
权限显示 与原文件权限一致(共享 inode 属性)
跨文件系统引用 硬链接无法跨文件系统
硬链接文件:ln 被链接文件
查看inode号: ls -li
2.软链接:
存储内容 目标文件的路径(字符串)
原文件删除 链接失效(成为“悬空链接”)
文件大小 等于路径字符串的长度(如 /path/to/file 占 14 字节)
inode 号 有独立的 inode
更新行为 若目标文件被移动/重命名,链接失效
权限显示 显示链接文件自身的权限(但访问时受目标文件权限限制)
跨文件系统引用 软链接可以跨文件系统
软链接文件:ln -s 被链接文件
九.解压和压缩
- gzip 和 gunzip
只能对单个的普通文件进行压缩或解压
压缩或解压后源文件不存在
压缩格式为.gz
gzip 文件名 //默认生成:文件名.gz
gunzip 文件名.gz
- bzip2 和 bunzip2
同上
压缩后生成的压缩格式为 .bz2 格式
bzip2 文件名 //默认生成:文件名.bz2 压缩文件
bunzip2 压缩文件名 //默认解压为:文件名
- xz 和 unxz
同上
压缩后生成的压缩格式为.xz格式
xz 文件名 //默认生成:文件名.xz 压缩文件
unxz 压缩文件名 //默认解压为:文件名
- zip 和 unzip
具有对多个文件归档功能,并进行压缩(会保留源文件)
可以压缩文件夹,后缀为.zip。压缩文件夹需加-r
压缩或者解压后源文件依然存在
zip 文件名.zip 文件名1 文件名2 文件名3
unzip
- tar
(1)
具有归档功能,并通过选项可以进行压缩或解压 (会保留源文件)
压缩或解压后源文件存在
需要写全压缩或解压的文件名格式:文件名.tar.压缩格式
(2)
选项:
-c:创建一个新的归档文件
-v:显示归档和释放的过程信息
-x:释放归档文件
-f:用户指定归档文件的文件名
-t:列出tar归档文件中包含的文件或目录
-j:由tar生成归档,然后由bzip2压缩 .bz2
-z:由tar生成归档,然后由gzip压缩 .gz
-J:由tar生成归档,然后由xz压缩 .xz
压缩:
tar -cvjf 文件名.tar.bz2 *
tar -cvzf 文件名.tar.gz *
tar -cvJf 文件名.tar.xz *
解压:
tar -xvf 文件名.tar.压缩格式
全部归档:
tar -cvf 文件名.tar
shell以及shell命令
一.shell解析器:
二.shell命令格式
Command [-Options] Argument1 Argument2 ...
三.shell中的特殊字符
(1)通配符
{1..3}:也可以取范围
(2)管道:把前一项命令的输出结果传给下一个命令
|
(3)输入输出重定向:把文件输出结果输出到文件内,有文件直接传输无文件则创建文件再传输
输入重定向:
<
输出重定向:
> >> 2> &>
(4)命令置换符:
``或者$
echo "my name is `hostname`" //``是解引用命令,返回命令执行后的内容
echo "my name is $(hostname)" //只有hostname可以
echo "my name is $HOSTNAME"
echo "my name is" $HOSTNAME
注:在makefile内,必须$(变量名)才可以取变量值,$只识别一个字符
shell脚本编程
什么是shell脚本: shell命令的有序集合
一.shell变量
1.自定义变量:和变量没有其他数据类型,所有赋值都解释为一串字符
定义格式: //等号两边不能有空格
变量名=值
变量名="值"
变量名='值' //内不能使用$展开变量的值
取值:$变量名
清空变量值:unset
只读变量:readonly
2.系统环境变量:系统配置好的,内置的变量
查看环境变量:env 或者 printenv
临时改变环境变量:export 变量名 = 值
永久改变: vi ~/.bashrc
3.位置变量和命令行参数:
获取指定的外部参数: $n //n取值0~9
${n} //n大于等于10
获取外部参数的个数: $# //不包含脚本名
获取所有外部参数: $* 或者 $@ //不包含脚本名
4.预定义变量:
获取上一条命令是否正确的执行结果: $? //0为真,1为假
获取当前脚本的进程ID: $$
二.shell语句
1.功能性语句
(1)shell中的赋值(相当于C语言中的scanf)
read 变量
read -s 变量 //输入的信息不回显
read -t 秒数 变量 //如果用户n秒不输入,就结束输入向后执行
read -n 个数 变量名 //如果输入n个字符,自动停止
read -p "内容" 变量 //先显示内容,相当于先pirntf内容再输入
(2)shell中的运算
1.expr:
(1).对数字表达式运算
运算符左右两侧必须有空格
*和()必须加转义字符,\* 、 \( \)
expr语句可以直接输出运算结果
expr \( 12 + 3 \) \* 2
NUM=`expr \( 12 + 3 \) \* 2`
(2).对字符串运算
match 字符串 字符串 //计算两个字符串从头相等的字符有几个
substr 字符串 偏移量 n //从偏移量的字符开始截取n个字符
index 字符串 字符 //返回字符在字符串中第一次被查找到时的下标,下标从1开始
length 字符串 //计算字符串的长度
2.let:
let运算时,运算符两侧不能有空格
let中使用变量时,可以加$也可以不加
如果直接写成 let 表达式,表达式会运行,但是没有办法接收
let NUM=2+3*3
let NUM=NUM++
(3)测试语句(test)
1.字符串测试:
test s1 = s2 //测试字符串的内容是否完全一样
test s1 != s2 //测试字符串的内容是否存在差异
test -z s1 //测试字符串的长度是否为空
test -n s1 //测试字符串的长度是否不为空
2.整数的测试:
test a -eq b //是否相等
test a -ne b //是否不相等
test a -gt b //是否大于b
test a -ge b //是否大于等于b
test a -lt b //是否小于b
test a -le b //是否小于等于b
3.文件属性测试
FILE1 -nt FILE2 //1的时间戳比2的更新
FILE1 -ot FILE2 //1的时间戳比2的更旧
-b FILE: //文件存在且是一个块设备文件
-c FILE: //文件存在且是一个字符设备文件
-d FILE: //文件存在且是一个目录文件
-f FILE: //文件存在且是一个普通文件
-e FILE: //文件存在
-h或者-L FILE: //文件存在且为软链接文件
-s FILE: //文件存在且大小不为0
-S FILE: //文件存在且是一个套接字文件
-p FILE: //文件存在且是一个管道文件
-w FILE: //文件存在且有可写权限
-r FILE: //文件存在且有可读权限
-x FILE: //文件存在且有可执行权限
2.结构性语句
(1)if
if 表达式
then
if 表达式
then
命令1
fi
elif
then
命令2
else
命令3
fi
(2)case
case 变量 in
模式)
命令表1
;; //类似break,仅限case使用
*)
命令表n
;;
esac
(3)while
while 命令或表达式
do
命令表
done
(4)for
for 变量名 in 单词表 //单词表为*的时候获取当前目录的所有文件
do
命令表
done
分文件编程
一.头文件:.h结尾的文件
1.包含头文件、宏定义、typedef、结构体、共用体、枚举的定义、函数声明、外部引用。
2.全局变量一般不定义在头文件中
二.源文件:.c结尾的文件
1.包括main.c 和其他子函数.c 文件
2.主函数要和子函数文件一起编译:gcc main.c fun.c -o test
编译工具
一.gcc编译工具
1.预处理:#展开头文件,替换宏定义,删除注释,不会进行语法检测。
gcc-E xx.c-oxx.i
2.编译:检查语法错误,词法错误,将.i文件转换成.s汇编文件
gcc-S xx.i -oxx.s
3.汇编:将汇编文件转换成二进制(不可执行)
gcc-c xx.s-oxx.o
4.链接:链接库文件,将不可执行的二进制文件转换成可执行的二进制文件。
gcc xx.o -o xx
注:使用 gcc -c xx.c -o xx.o 可以将前三步骤一起实现
二.gdb调试工具
1.gdb 可执行文件:进入程序调试页面
2.选项: r:运行代码
l:查看文件
b 行号或者函数名:添加断点
info b:查看断点情况
d num:删除断点(num是断点编号)
p 变量名:查看变量的值
n:逐行执行,遇到函数调用时直接执行完整个函数,不进入内部。
s:逐语句执行,遇到函数调用时进入函数内部逐行调试。
c: 执行到下一个断点的位置
help:帮助
q:退出
三.make工具
1.定义:工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作。
2.makefile格式:
(1)格式:
目标:依赖
命令
例:
test:main.o
gcc main.o -o test
main.o:main.c
gcc -c main.c -o main.o
(2)伪目标:
目的:去执行目标下面的命令
test:main.o
gcc main.o -o test
main.o:main.c
gcc -c main.c -o main.o
.PHONY:clean
clean:
rm test *.o
3.用make管理多个文件(初版)
test:main.o fun.o
gcc main.o fun.o -o test
main.o :main.c
gcc -c main.c -o main.o
fun.o:fun.c
gcc -c fun.c -o fun.o
.PHONY:clean
clean:
rm test *.o test
4.makefile变量
(1)自定义变量:一般用大写表示变量名
= :递归方式展开
:= :直接赋值
+= :在变量后copy这个值的值
?= :判断是否定义过,如果该变量没有定义过赋值
(2)预定义变量:系统预先定义好的
RM :文件删除程序的名称,默认值为rm -f
CC :C编译器的名称,默认值为cc
CPP :C预编译器的名称,默认值为$(CC) –E (一般用不到)
CFLAGS :C编译器的选项,无默认值
OBJS :生成的二进制文件或目标文件,自己定义
CC=gcc
CFLAGS=-c -g // -g是加调试
BOJS=main.o fun.o
test:$(BOJS)
$(CC) $(BOJS) -o test
main.o:main.c
$(CC) $(CFLAGS) main.c -o main.o
fun.o:fun.c
$(CC) $(CFLAGS) fun.c -o fun.o
.PHONY:clean
clean:
$(RM) *.o test
(3)自动变量
$< :第一个依赖文件的名称
$^ :所有不重复的依赖文件,以空格隔开
$@ :目标文件的完整名称
CC=gcc
CFLAGS=-c
BOJS=main.o fun.o
test:$(BOJS)
$(CC) $^ -o $@
%.o:%.c
$(CC) $(CFLAGS) $^ -o $@
.PHONY:clean
clean:
$(RM) *.o test
5.make指令
make -s :隐藏执行的指令
make -C 路径 :进入路径下执行make指令
条件编译
1. 根据宏是否定义
#define 宏名
#ifdef 宏名
代码块1
#else
代码2
#endif
2.根据宏值
#define 宏名 值
#if 宏名 //宏的值是否为非0
代码块1
#else
代码块2
#endif
3.防止头文件重复包含
#ifndef 宏名
#define 宏名
头文件中内容
#endif
目的:加上防止头文件重复包含