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    //调试可执行文件
优化源代码-- -O[n]

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

优化级别 核心特点 主要优化内容
-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来打印我们之前使用的所有命令

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

相关推荐
徐子元竟然被占了!!2 小时前
数字证书学习
linux·网络·学习
百结2142 小时前
LVS-DR 群集部署
运维·服务器·网络
langmeng1102 小时前
Linux安装Kafka3.8.0版本不使用zookeeper
linux·运维·服务器
亚空间仓鼠2 小时前
Shell脚本详解:从理论到实践(二)
linux·运维·服务器
董崇德2 小时前
当CPU飙高时,SRE的排查清单——USE Method实战
运维
岳来2 小时前
网络小白docker network create时如何指定subnet 和gateway
网络·docker·gateway·subnet
D4c-lovetrain2 小时前
Linux个人心得25 (mysql⑤)
linux·运维·mysql
复园电子2 小时前
HTTPS与TLS1.2双重加密:USB网络数据传输安全的底层核心技术解析
服务器·网络·安全·https
菜_小_白2 小时前
RTP协议收发组件开发
linux·网络·c++