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 lshelp cd接口系统版本--uname -auname -a一共分为10段字符第一段(Linux):系统内核类型第二段(raspberrypi):主机名第三段(6.6.31rpt-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-1rpt1):发行版关联信息Debian是所有Linux发行版的“鼻祖”后面为其打包代码第六段((2024-05-29)):内核编译时间第七段(aarch64):系统架构可以看出本系统是64ARM架构的第八段(GNU/Linux):系统类型网址查看本地网络地址--hostname -Ihostname -I前面为其IPv4网络地址后面为树莓派中虚拟网卡的网址最后为其IPv6网络地址如果进行ssh远程连接需要使用的网址为最前面和最后面的两个地址但是IPv6的网址兼容性较差同时配置较为麻烦查看所有网卡IP地址--ifconfigifconfigdocker0:Docker容器用的虚拟网卡eth0:有线网口只有IPv6没有IPv4表示没插网线lo:本地回环其作用是实现计算机自己内部的通信wlan0:wifi网卡既有IPv4也有IPv6表示树莓派已经连接了无线网络inet:IPv4地址--SSH、VNC、网页访问全都用它是设配频段的唯一标识inet6:IPv6地址netmask:IPv4地址子网掩码--用于判断对方和我在不在同一个局域网prefixlen:IPv6地址掩码broadcast:广播--传递信息时所走的频段USB设备--lsusblsusb从图中可以看出usb的第三个接口连接了一个摄像头其余usb接口均未使用储存查看总剩余储存--df -hdf -h查看某个文件占的位置查看单个文件--du 文件名查看当前文件大小--du -sh查看当前文件下各个子目录的大小du -h | less目录和文件目录结构Bin该目录中储存的都是一些二进制文件文件可以直接被运行比如一些指令等(cd、pwd等)Sbin该目录中也储存的都是一些二进制文件但是这些文件必须有super权限的用户才可以执行Dev该目录主要存放的是外接设备在其中的外接设备是不能直接被使用的需要挂载。Etc该目录主要储存一些配置文件Home表示除了root用户以外其他用户的家目录Proc该目录中存储的是Linux运行时候的进程Rootroot根用户(管理员)自己的家目录Tmp当系统运行时产生的临时文件会存储在这个目录Usr存放的是用户自己安装的软件Var存放的程序/系统的日志文件的目录Mnt当外接设备需要挂载的时候就需要挂载到mnt目录下查看文件/目录切换目录--cdcd其中~表示树莓派的主文件夹因此cd ~可以直接跳转回主文件夹同时cd ..表示退回上一级注意含有空格地址一般分为绝对地址和相对地址绝对地址是从最初的文件夹下开始寻找同时最前面有/而相对地址前面不需要加/直接从当前文件下开始寻找查看当前所在目录--pwdpwd查看当前文件夹下的目录和文件查看未隐藏的目录和文件--lsls其中不同的颜色也有不同的意义深蓝色字体表示子目录其余颜色字体表示文件不同文件之间的字体颜色也不相同而对于子目录而言当其背景使用颜色为绿色时其表示所有人都可以写入的子目录显示指定首字母下的子目录和文件--ls a(任意字母)*ls a(任意字母)*显示系统所有的子目录和文件--ls -als -a通常来说使用.开头的文件为系统自动隐藏的格式一般来说是不会被看到的显示该文件夹下文件/目录的详细信息--ls -lls -l可以看出今天我们在该文件夹下所做的操作其列从左至右依次表示为权限、链接数、所有者、所属组、大小、修改时间、文件名针对于第一列--权限而言文件权限一般分为4段类型、属主、用户名和其他用户第一段:一个字符d表示目录-表示文件第二段:三个字符表示属主的具体权限。r表示可读w表示可写2x表示可执行没有的字符对应位置为-第三段:三个字符表示组内所有用户的具体权限。其具体表示含义同上。最后一段:三个字符表示除了用户和用户组之外的用户的具体权限。其具体表示含义同上。一般而言我们只需要关系第二段即可。文件/目录应用修改文件和目录重命名--mvmv完成复制/副本--cpcp初次之外也可以使用cp来创建一个文件的副本其内容与源文件相同当要创建一个目录副本时需要添加一个参数-r/-a-r:递归创建目录副本-a:递归创建目录副本同时保留源目录的权限修改时间等属性删除文件/目录--rmrm同上删除文件直接输入文件名即可但是要删除目录需要加上-r以递归删除rm *--删除该目录下的所有文件无法删除目录此外rm dir(文件名).*删除以dir(文件名)开头的所有文件文件应用创建空文件--touch相对地址创建文件绝对地址创建文件创建文件并写入或追加内容--echoecho该方法使用效率更高但是只适合一些较短的编辑同时在输入已有的文件名时输入的内容会覆盖已有文件的内容编辑文件内容--nanonano直接输入nano为创建一个新的缓冲文本添加上一个已有的名称时则打开该文件在编辑中通常无法使用鼠标移动一般使用方向键同时使用ctrl某一个字符表示一个特定的功能名称功能名称功能名称功能ctrlG帮助ctrlO写入ctrl_W搜索名称功能名称功能名称功能ctrlK剪切ctrlT执行命令ctrl_C位置名称功能名称功能名称功能ctrlX离开ctrlR读档ctrl_\替换名称功能名称功能名称功能ctrlU粘贴ctrlJ对齐ctrl_/跳行查看文件内容--cat/morecat/morecat和more的功能都是一样的但是cat是直接显示文件的所有内容不管文件有多长而more一次显示一屏的文本不管本文有多短对于more而言按键作用q立即退出more查看界面空格键向下翻一整页回车键向下翻一行b向上翻一页Ctrl C强制退出more更适合查看小文件当需要查看大文件或者需要加载这些文件的日志时一般都使用less此外cat的功能不止有查看还可以串联多个文件查找文件所在位置--findfind如图该代码表示查找~下面的所有文件且该文件是以main开头其中*表示通配符。过滤文件--grepgrep目录应用创建目录--mkdirmkdir一次性创建多层不存在的目录--mkdir -pmkdir -p权限拥有所有权限的用户即是超级用户进入超级用户模式暂时进入--sudo在使用的操作前面加入sudo时段进入--sudo shsudo sh使用sudo sh后系统会自动将使用者的权限提高最高--即成为超级用户同时后面的命令行的前缀也变为了#输入exit退出否则一直会在超级用户中修改文件权限--chmodchmod角色字母含义uuser文件所有者比如 piggroup所属组oother其他所有用户aall以上所有角色权限二进制含义r4读权限w2写权限x1执行权限其中角色和权限中的符号(、-、)分别表示添加、移除、设置设置需要写入上述的三个字符其除了使用字母还有一种更加方便的方式即使用二进制数常用的二进制数如下每三个字符一组数字对应权限适用场景755rwxr-xr-x可执行脚本 / 目录最安全644rw-r--r--普通文件文档 / 配置文件777rwxrwxrwx所有人可读写执行慎用同样的如果要修改一个目录下所有文件的权限需要在chmod后面添加-r实现递归当权限不够时在chmod前面加入sudo进入超级用户模式。软件应用软件下载--apt-get installapt-get install软件下载一般需要进入超级用户模式因此一般使用如下代码sudo apt-get install name of software软件更新--apt-get updateapt-get update软件更新一般需要进入超级用户模式因此一般使用如下代码sudo apt-get update name of software软件删除--apt-get removeapt-get remove软件更新一般需要进入超级用户模式因此一般使用如下代码sudo apt-get remove name of softwareapt-get remove一般只会清除软件的安装包但是下载软件后会下载自身依赖的各种软件因此需要使用下述的代码进行深层次的清除sudo apt-get autoremove abiwordsudo apt-get clean查看下载软件--apt listapt list由于下载的软件过多因此一般在后面加入一个less按q退出系统操作重启系统--reboot关机--shutdown -h [时间]立即关机--shotdown -h now文件编辑除了上述所写的nano编辑器以外最常用的编辑器为Vimvim三种核心工作方式模式名称核心作用如何进入典型特征普通模式 (Normal Mode)浏览、复制、粘贴、删除文本启动 Vim 默认进入其他模式按Esc键返回光标在文本上闪烁底部显示文件名或为空插入模式 (Insert Mode)输入 / 编辑文本内容普通模式下按i、a、o等键底部显示-- INSERT --或-- 插入 --命令行模式 (Command-line Mode)保存、退出、搜索、替换、设置等普通模式下按:键光标停在底部的:提示符后等待输入命令普通模式这是 Vim 的 “指挥中心”你不能直接打字输入内容但可以通过快捷键高效操作文本移动光标h左、j下、k上、l右也可以用方向键复制yy复制当前行、yw复制一个单词粘贴p粘贴到光标后、P粘贴到光标前删除dd删除当前行、dw删除一个单词、x删除光标处的字符撤销u撤销上一步操作。插入模式写代码或者脚本时进入的模式。进入方式i在光标前插入Inserta在光标后插入Appendo在光标下方新建一行插入OpenO在光标上方新建一行插入。退出方式按Esc键返回普通模式。命令行模型常用命令:w保存文件Write:q退出 VimQuit:wq保存并退出先w后q: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 arg2start启动并停在main第一行单步调试首选continue (c)从断点继续运行到下一个断点或程序结束kill终止当前调试程序断点管理break (b) 行号 / 函数名设置断点b 10/b main/b file.cpp:10info breakpoints (i b)查看所有断点信息delete (d) [断点编号]删除断点d 1删编号 1d删所有disable [断点编号]禁用断点不删除enable [断点编号]恢复禁用的断点查看源代码list (l)查看源代码默认 10 行l 10从第 10 行开始list -往前显示源代码单步执行next (n)单步下一行不进函数内部step (s)单步下一行进自定义函数内部finish跳出当前函数until (u) 行号运行到指定行停下如u 20查看变量与数据print (p) 变量 / 表达式查看值p i/p abptype 变量名查看变量类型display 变量名单步后自动显示变量undisplay [编号]取消自动显示x 地址 / 变量查看内存数据info locals查看当前函数所有局部变量调用栈与函数帧backtrace (bt)查看函数调用栈定位崩溃神器frame (f) 帧编号切换到指定函数帧f 0切到最内层up切换到上一层函数帧down切换到下一层函数帧修改与控制set var 变量 值临时修改变量set var i10jump (j) 行号强制跳转到指定行signal 信号名给程序发信号辅助命令help (h) [命令]查看命令帮助h breakinfo 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如果你链接的头文件是通过来链接的那么其会先搜索你指定的目录的头文件再搜索默认路径下的头文件如果有相同的头文件其前者为主。如果你的头文件是通过来链接的则相反。打印警报信息-- -Wallg -Wall test.cpp关闭警报信息-- -wg -w test.cpp设置编译标准/版本-- -std(c版本)g -stdc11 test.cpp //使用c标准编译test.cpp生成库文件并编译静态库在编译链接阶段把库的代码完整复制进可执行文件里程序运行时不再依赖库。动态库在编译链接阶段只记录库的 “名字和位置”不复制代码程序运行时由系统的动态链接器ld.so把库加载到内存中使用。维度静态库动态库Linux 后缀.a.soWindows 后缀.lib.dll程序体积大小运行速度快稍慢内存占用高低库更新方式需重新编译链接你的程序只需替换.so文件无需重新编译程序部署难度简单稍复杂生成静态库-c表示生成.o机器语言文件运行静态库时可以直接运行生成动态库其在执行动态库的文件时需要先指定动态库所在的位置LD_LIBRARY_PATHsrc再进行编译查看执行时间--time使用命令行历史记录--history当你想要重复执行某一步命令时一般可以使用方向键上/下来控制同时我们可以通过history来打印我们之前使用的所有命令然后使用 !(所需要命令对应的数字)