Linux操作系统基本操作

命令

重定向

>

把命令的输出保存到文件,比如后续的cat命令,将多个文件的内容同时输出(整合)到一个文件中

复制代码
# 把ls -l的结果保存到file_list.txt(覆盖原有内容)
ls -l > file_list.txt

# 把树莓派IP保存到ip.txt
hostname -I > ip.txt

# 清空文件(echo空内容覆盖)
echo "" > empty.txt

追加

>>

把命令的输出保存到文件,但是不覆盖源文件内容

复制代码
# 把新的IP信息追加到ip.txt末尾(不删原有内容)
hostname -I >> ip.txt

管道

|

把前一个命令的输出传给后一个命令处理,常常搭配grep(过滤)使用

复制代码
# ls -l的结果传给grep,过滤出含txt的文件
ls -l | grep txt

# 查看所有已安装包,传给less分页查看
apt list --installed | less

查看linux中全部的命令手册--man/help

这个后面需要指定需要了解的命令是什么

man ls

help cd

接口

系统版本--uname -a

uname -a

一共分为10段字符

第一段(Linux):系统内核类型

第二段(raspberrypi):主机名

第三段(6.6.31+rpt-rpi-2712):内核版本核心,6.6.31是指Linux内核版本号;+rpt是raspberrypi的定制内核;rpi-2712是芯片型号--BCM2712,其适配树莓派5,树莓派4B使用的为BCM2711

第四段(#1 SMP PREEMPT):内核编译信息,#1表示该版本内核的编译次数;SMP表示该树莓派支持多核调度;PREEMPT表示其支持抢占式调度

第五段(Debian 1:6.6.31-1+rpt1):发行版关联信息,Debian是所有Linux发行版的"鼻祖",后面为其打包代码

第六段((2024-05-29)):内核编译时间

第七段(aarch64):系统架构,可以看出本系统是64ARM架构的

第八段(GNU/Linux):系统类型

网址

查看本地网络地址--hostname -I

hostname -I

前面为其IPv4网络地址,后面为树莓派中虚拟网卡的网址,最后为其IPv6网络地址

如果进行ssh远程连接,需要使用的网址为最前面和最后面的两个地址,但是IPv6的网址兼容性较差,同时配置较为麻烦

查看所有网卡&IP地址--ifconfig

ifconfig

docker0:Docker容器用的虚拟网卡

eth0:有线网口,只有IPv6,没有IPv4表示没插网线

lo:本地回环,其作用是实现计算机自己内部的通信

wlan0:wifi网卡,既有IPv4,也有IPv6,表示树莓派已经连接了无线网络

inet:IPv4地址--SSH、VNC、网页访问全都用它,是设配频段的唯一标识

inet6:IPv6地址

netmask:IPv4地址子网掩码--用于判断对方和我在不在同一个局域网

prefixlen:IPv6地址"掩码"

broadcast:广播--传递信息时所走的频段

USB设备--lsusb

lsusb

从图中可以看出usb的第三个接口连接了一个摄像头,其余usb接口均未使用

储存

查看总剩余储存--df -h

df -h

查看某个文件占的位置
查看单个文件--du 文件名
查看当前文件大小--du -sh
查看当前文件下各个子目录的大小du -h | less

目录和文件

目录结构

Bin

该目录中储存的都是一些二进制文件,文件可以直接被运行,比如一些指令等(cd、pwd等)

Sbin

该目录中也储存的都是一些二进制文件,但是这些文件必须有super权限的用户才可以执行

Dev

该目录主要存放的是外接设备,在其中的外接设备是不能直接被使用的,需要挂载。

Etc

该目录主要储存一些配置文件

Home

表示除了root用户以外其他用户的家目录

Proc

该目录中存储的是Linux运行时候的进程

Root

root根用户(管理员)自己的家目录

Tmp

当系统运行时产生的临时文件会存储在这个目录

Usr

存放的是用户自己安装的软件

Var

存放的程序/系统的日志文件的目录

Mnt

当外接设备需要挂载的时候,就需要挂载到mnt目录下

查看文件/目录

切换目录--cd

cd

其中~表示树莓派的主文件夹,因此cd ~可以直接跳转回主文件夹

同时cd ..表示退回上一级,注意含有空格


地址一般分为绝对地址和相对地址,绝对地址是从最初的文件夹下开始寻找,同时最前面有/;而相对地址前面不需要加/,直接从当前文件下开始寻找

查看当前所在目录--pwd

pwd

查看当前文件夹下的目录和文件
查看未隐藏的目录和文件--ls

ls

其中不同的颜色也有不同的意义,深蓝色字体表示子目录,其余颜色字体表示文件,不同文件之间的字体颜色也不相同,而对于子目录而言,当其背景使用颜色为绿色时,其表示所有人都可以写入的子目录

显示指定首字母下的子目录和文件--ls a(任意字母)*

ls a(任意字母)*

显示系统所有的子目录和文件--ls -a

ls -a

通常来说使用.开头的文件为系统自动隐藏的格式,一般来说是不会被看到的

显示该文件夹下文件/目录的详细信息--ls -l

ls -l

可以看出今天我们在该文件夹下所做的操作,其列从左至右依次表示为

权限、链接数、所有者、所属组、大小、修改时间、文件名

针对于第一列--权限而言,文件权限一般分为4段(类型、属主、用户名和其他用户)

第一段:一个字符,d表示目录;-表示文件

第二段:三个字符,表示属主的具体权限。r表示可读;w表示可写2;x表示可执行;没有的字符对应位置为-

第三段:三个字符,表示组内所有用户的具体权限。其具体表示含义同上。

最后一段:三个字符,表示除了用户和用户组之外的用户的具体权限。其具体表示含义同上。

一般而言,我们只需要关系第二段即可。

文件/目录应用

修改文件和目录重命名--mv

mv

完成复制/副本--cp

cp

初次之外,也可以使用cp来创建一个文件的副本,其内容与源文件相同

当要创建一个目录副本时,需要添加一个参数-r/-a

-r:递归创建目录副本

-a:递归创建目录副本,同时保留源目录的权限,修改时间等属性

删除文件/目录--rm

rm

同上,删除文件直接输入文件名即可,但是要删除目录需要加上-r以递归删除

rm *--删除该目录下的所有文件(无法删除目录)

此外rm dir(文件名).*

删除以dir(文件名)开头的所有文件

文件应用

创建空文件--touch

相对地址创建文件

绝对地址创建文件

创建文件并写入或追加内容--echo

echo

该方法使用效率更高,但是只适合一些较短的编辑,同时在输入已有的文件名时,输入的内容会覆盖已有文件的内容

编辑文件内容--nano

nano

直接输入nano为创建一个新的缓冲文本,添加上一个已有的名称时则打开该文件

在编辑中通常无法使用鼠标,移动一般使用方向键,同时使用ctrl+某一个字符表示一个特定的功能

|--------|----|--------|------|---------|----|
| 名称 | 功能 | 名称 | 功能 | 名称 | 功能 |
| ctrl+G | 帮助 | ctrl+O | 写入 | ctrl_W | 搜索 |
| 名称 | 功能 | 名称 | 功能 | 名称 | 功能 |
| ctrl+K | 剪切 | ctrl+T | 执行命令 | ctrl_C | 位置 |
| 名称 | 功能 | 名称 | 功能 | 名称 | 功能 |
| ctrl+X | 离开 | ctrl+R | 读档 | ctrl_\ | 替换 |
| 名称 | 功能 | 名称 | 功能 | 名称 | 功能 |
| ctrl+U | 粘贴 | ctrl+J | 对齐 | ctrl_/ | 跳行 |

查看文件内容--cat/more

cat/more

cat和more的功能都是一样的,但是cat是直接显示文件的所有内容,不管文件有多长;而more一次显示一屏的文本,不管本文有多短

对于more而言

按键 作用
q 立即退出more查看界面
空格键 向下翻一整页
回车键 向下翻一行
b 向上翻一页
Ctrl + C 强制退出

more更适合查看小文件,当需要查看大文件,或者需要加载这些文件的日志时,一般都使用less

此外cat的功能不止有查看,还可以串联多个文件

查找文件所在位置--find

find

如图,该代码表示查找~下面的所有文件,且该文件是以main开头,其中*表示通配符。

过滤文件--grep

grep

目录应用

创建目录--mkdir

mkdir

一次性创建多层不存在的目录--mkdir -p

mkdir -p

权限

拥有所有权限的用户即是超级用户

进入超级用户模式

暂时进入--sudo

在使用的操作前面加入sudo

时段进入--sudo sh

sudo sh

使用sudo sh后,系统会自动将使用者的权限提高最高--即成为超级用户,同时后面的命令行的前缀也变为了#,输入exit退出,否则一直会在超级用户中

修改文件权限--chmod

chmod

角色 字母 含义
u user 文件所有者(比如 pi)
g group 所属组
o other 其他所有用户
a all 以上所有角色
权限 二进制 含义
r 4 读权限
w 2 写权限
x 1 执行权限

其中角色和权限中的符号(+、-、=)分别表示添加、移除、设置,设置需要写入上述的三个字符

其除了使用字母,还有一种更加方便的方式即使用二进制数,常用的二进制数如下(每三个字符一组)

数字 对应权限 适用场景
755 rwxr-xr-x 可执行脚本 / 目录(最安全)
644 rw-r--r-- 普通文件(文档 / 配置文件)
777 rwxrwxrwx 所有人可读写执行(慎用)

同样的,如果要修改一个目录下所有文件的权限,需要在chmod后面添加-r实现递归,当权限不够时,在chmod前面加入sudo进入超级用户模式。

软件应用

软件下载--apt-get install

apt-get install

软件下载一般需要进入超级用户模式,因此一般使用如下代码

sudo apt-get install <name of software>

软件更新--apt-get update

apt-get update

软件更新一般需要进入超级用户模式,因此一般使用如下代码

sudo apt-get update <name of software>

软件删除--apt-get remove

apt-get remove

软件更新一般需要进入超级用户模式,因此一般使用如下代码

sudo apt-get remove <name of software>

apt-get remove一般只会清除软件的安装包,但是下载软件后会下载自身依赖的各种软件,因此需要使用下述的代码进行深层次的清除

sudo apt-get autoremove abiword

sudo apt-get clean

查看下载软件--apt list

apt list

由于下载的软件过多,因此一般在后面加入一个less

按q退出

系统操作

重启系统--reboot

关机--shutdown -h 时间

立即关机--shotdown -h now

文件编辑

除了上述所写的nano编辑器以外,最常用的编辑器为Vim

vim三种核心工作方式

模式名称 核心作用 如何进入 典型特征
普通模式 (Normal Mode) 浏览、复制、粘贴、删除文本 启动 Vim 默认进入;其他模式按 Esc 键返回 光标在文本上闪烁,底部显示文件名或为空
插入模式 (Insert Mode) 输入 / 编辑文本内容 普通模式下按 iao 等键 底部显示 -- INSERT --(或 -- 插入 --
命令行模式 (Command-line Mode) 保存、退出、搜索、替换、设置等 普通模式下按 : 光标停在底部的 : 提示符后,等待输入命令
普通模式

这是 Vim 的 "指挥中心",你不能直接打字输入内容,但可以通过快捷键高效操作文本:

移动光标:h(左)、j(下)、k(上)、l(右),也可以用方向键;

复制:yy(复制当前行)、yw(复制一个单词);

粘贴:p(粘贴到光标后)、P(粘贴到光标前);

删除:dd(删除当前行)、dw(删除一个单词)、x(删除光标处的字符);

撤销:u(撤销上一步操作)。

插入模式

写代码或者脚本时进入的模式。

进入方式

i:在光标前插入(Insert);

a:在光标后插入(Append);

o:在光标下方新建一行插入(Open);

O:在光标上方新建一行插入。

退出方式

Esc 键,返回普通模式。

命令行模型
常用命令

:w:保存文件(Write);

:q:退出 Vim(Quit);

:wq:保存并退出(先 wq);

:q!:强制退出,不保存(! 表示强制);

:w filename:另存为 filename

退出方式

执行完命令自动返回普通模式;按 Esc 键可取消命令,直接返回普通模式。

vim的三种安装格式

当你不使用上面的apt-get install vim来安装vim时,需要从源码编译安装vim,这样的vim可以指定不同的配置选项

最小化编译

只编译核心功能,体积最小,速度最快

标准编译

vim官方给出的默认安装方案,也是apt-get install vim安装的格式。

GUI版本编译

在标准/全功能编译的基础上,额外开启图像界面(GUI)的支持,其不仅可以在终端运行vim,也可以在linux的桌面环境中,像普通桌面软件一样以独立窗口运行。

编译程序--以c++为例

在编译程序前需要先确保自己所使用的语言已经被下载

g++是linux中c++使用的编译器

gcc是linux中c使用的编译器

python3是linux中python使用的编译器

使用vim创建源码

vim hello.cpp

进入插入模式,编写程序

使用i进入插入模型,并写出自己所需要的代码程序

保存代码,退出vim

写完代码后按Esc返回普通模式,然后输入:wq退出并保存

使用g++(程序自己对应的语言编译器)编译代码

g++:调用c++编译器

hello.cpp:所写的源文件代码

-o hello:指定编译器后生成的可执行文件名为hello(不加-o的话,默认会生成名为a.out的文件)
如果你先编译 hello.cpp 生成了 a.out,接着又编译 world.cpp,新的 a.out 会直接覆盖旧的,之前的程序就没了,根本分不清 a.out 到底是哪个程序的。

同时由于命名的强制性,生成的该文件命名无法修改,导致后续根本不知道该文件的意义。

运行程序,输出代码结果
不退出vim,直接在vim中编译运行

在保存代码后,不退出vim,直接输入下面命令可以直接在vim中运行

!:强制执行

g++:所使用的编译器

%:代表当前打开的文件名

-o:指定编译器生成的可执行文件,同时不生成名为a.out的文件

%<:去掉后缀的文件名作为可执行文件名

&&:前面执行成功后,才执行后面的运行命令

其实这就是在终端运行

复制代码
g++ hello.cpp -o hello
./hello

只不过是使用&和&&替代文件名或连接两个代码

执行程序

除了上面的编译和执行程序以外,还有需要注意的地方

C/C++调试器--GDB

设置断点:让程序在指定的代码行停下来,一步一步看执行流程;

单步执行:一行一行地跑代码,看每一步的变量变化;

查看变量 / 内存:程序停下来时,查看某个变量的值、内存里的数据;

定位崩溃:程序突然崩溃时,直接定位到崩溃的那一行代码;

查看调用栈:看程序是怎么一步步调用到当前位置的,理清函数调用关系。

前置条件

用GDB调试的程序,编译时必须加 -g,把调试信息编进可执行文件里,否则GDB看不到代码行号,没法调试。

生成带编译信息的可执行文件
复制代码
g++ hello.cpp -o hello -g    //生成带调试信息的可执行文件
gdb hello    //调试可执行文件
优化源代码-- -On

优化源代码让编译器对生成的机器码进行不同程度的优化,提升程序运行速度或减小代码体积,但会以 "增加编译时间""降低调试友好度" 为代价,极端情况下甚至可能影响程序兼容性。

优化级别 核心特点 主要优化内容
-O0(默认) 不优化 完全不做任何代码优化,编译速度最快,生成的机器码和源代码一一对应
-O1 基础优化 做简单的通用优化:减少不必要的跳转、简化常量表达式、删除无用代码
-O2 推荐生产级优化 -O1 基础上做深度优化:循环展开、小函数内联、指令重排、寄存器优化等
-O3 最高级激进优化 -O2 基础上做更激进的优化:循环向量化(SIMD)、更多函数内联、循环变换、自动并行化尝试
-Os 优化代码体积 -O2 基础上优先减小可执行文件大小,牺牲部分速度
-Ofast 最激进极致优化 -O3 基础上开启不符合标准的优化:忽略浮点数精度、快速数学运算、破坏严格别名规则

一般来说使用-O2即可

常用命令

进入gdb调试系统后,可以输入一下命令进行调试

命令(简写) 核心作用 简化说明 / 示例
程序启动与运行控制
run (r) 完整运行程序,遇断点停下 可传参:r arg1 arg2
start 启动并停在 main 第一行 单步调试首选
continue (c) 从断点继续运行 到下一个断点或程序结束
kill 终止当前调试程序
断点管理
break (b) 行号 / 函数名 设置断点 b 10 / b main / b file.cpp:10
info breakpoints (i b) 查看所有断点信息
delete (d) 断点编号 删除断点 d 1 删编号 1,d 删所有
disable 断点编号 禁用断点(不删除)
enable 断点编号 恢复禁用的断点
查看源代码
list (l) 查看源代码 默认 10 行,l 10 从第 10 行开始
list - 往前显示源代码
单步执行
next (n) 单步下一行,不进函数内部
step (s) 单步下一行,进自定义函数内部
finish 跳出当前函数
until (u) 行号 运行到指定行停下 u 20
查看变量与数据
print (p) 变量 / 表达式 查看值 p i / p a+b
ptype 变量名 查看变量类型
display 变量名 单步后自动显示变量
undisplay 编号 取消自动显示
x 地址 /& 变量 查看内存数据
info locals 查看当前函数所有局部变量
调用栈与函数帧
backtrace (bt) 查看函数调用栈 定位崩溃神器
frame (f) 帧编号 切换到指定函数帧 f 0 切到最内层
up 切换到上一层函数帧
down 切换到下一层函数帧
修改与控制
set var 变量 = 值 临时修改变量 set var i=10
jump (j) 行号 强制跳转到指定行
signal 信号名 给程序发信号
辅助命令
help (h) 命令 查看命令帮助 h break
info registers (i r) 查看 CPU 寄存器
watch 变量名 监视变量,值变化时停下 数据断点
quit (q) 退出 GDB

链接外部库

指定库文件-- -l

当文件在/lib和/usr/lib和/usr/local/lib里的库直接使用-l参数就能链接

复制代码
g++ -lglog test.cpp    //链接glog库
指定库文件路径-- -L

当库不在上面的三个目录中,则需要使用-L指定库文件所在目录

复制代码
g++ -L/home/bing/mylib -lmytest test.cpp    //链接mytest库

指定头文件搜索目录-- -I

如果你的头文件在/usr/include中,系统编译时会自动调用,但是当你的头文件不在这个目录中时(比如你从github上下载头文件),就需要使用-I来指定头文件的搜索目录。

复制代码
g++ -I/myinclude test.cpp

如果你链接的头文件是通过""来链接的,那么其会先搜索你指定的目录的头文件,再搜索默认路径下的头文件,如果有相同的头文件,其前者为主。

如果你的头文件是通过<>来链接的,则相反。

打印警报信息-- -Wall

复制代码
g++ -Wall test.cpp

关闭警报信息-- -w

复制代码
g++ -w test.cpp

设置编译标准/版本-- -std=(c++版本)

复制代码
g++ -std=c++11 test.cpp    //使用c++标准编译test.cpp

生成库文件并编译

静态库:在编译链接阶段,把库的代码完整复制进可执行文件里,程序运行时不再依赖库。

动态库:在编译链接阶段,只记录库的 "名字和位置",不复制代码;程序运行时由系统的动态链接器(ld.so)把库加载到内存中使用。

维度 静态库 动态库
Linux 后缀 .a .so
Windows 后缀 .lib .dll
程序体积
运行速度 稍慢
内存占用
库更新方式 需重新编译链接你的程序 只需替换 .so 文件,无需重新编译程序
部署难度 简单 稍复杂
生成静态库

-c表示生成.o机器语言文件,运行静态库时,可以直接运行

生成动态库

其在执行动态库的文件时,需要先指定动态库所在的位置,LD_LIBRARY_PATH=src,再进行编译

查看执行时间--time

使用命令行历史记录--history

当你想要重复执行某一步命令时,一般可以使用方向键(上/下)来控制,同时我们可以通过history来打印我们之前使用的所有命令

然后使用 !(所需要命令对应的数字)

相关推荐
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
小宇宙Zz3 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
网络研究院3 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
treesforest3 天前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
古城小栈3 天前
Unix 与 Linux 异同小叙
linux·服务器·unix