Linux 基础与环境搭建
Linux 基础指令与权限
核心基础指令集(文件与目录操作)
-
浏览与定位
-
ls (List):列出目录内容。
-
-a:显示所有文件(包括以 . 开头的隐藏文件)。
-
-l:长格式显示(详细权限、大小、所有者)。
-
-R:递归显示子目录。
-
-
pwd (Print Working Directory):显示当前所在绝对路径。
-
cd (Change Directory):切换路径。
-
cd ...:回退上级目录。
-
cd ~:进入家目录。
-
cd -:返回最近访问的目录。
-
-
-
创建与删除
-
touch:新建普通文件或更新文件时间戳。
-
mkdir (Make Directory):创建目录。
- -p:递归创建多层级目录(如 mkdir -p a/b/c)。
-
rm (Remove):删除文件或目录。
-
-f:强制删除。
-
-r:递归删除(删除目录必备)。
-
【模拟实现:安全回收站逻辑】
-
资料提示将 rm 改造成 mv(移动到废铁站)以防误删。以下为代码实现:
-
-
-
-
复制与移动
-
cp (Copy):复制。
- -r:复制目录必加。
-
mv (Move):移动或重命名。
- 区别:在同一目录下移动即为"重命名";跨目录移动即为"剪切"。
-
文件搜索与过滤
-
find 指令
-
原理:在磁盘中实时搜索,功能强大但速度相对较慢(访问磁盘)。
-
语法:find [路径] -name [文件名]。
-
-
grep 指令
-
原理:行过滤工具。在文件中搜索字符串,并打印匹配行。
-
常用选项:
-
-i:忽略大小写。
-
-v:反向选择(输出不匹配的行)。
-
-n:显示行号。
-
-
-
两者本质区别
-
find:找文件(在书架上找某本书)。
-
grep:找内容(在书里找某个句子)。
-
打包、压缩与解压
-
zip / unzip
-
zip -r test.zip test/:递归压缩目录。
-
unzip test.zip -d /tmp:解压到指定目录。
-
-
tar (最常用)
-
核心选项:
-
-c:创建压缩档。
-
-x:解开压缩档。
-
-z:使用 gzip 压缩/解压(后缀通常为 .tar.gz)。
-
-v:显示过程。
-
-f:必带,指定档名(必须紧跟在选项最后)。
-
-
-
常用组合:
-
打包压缩:tar -zcvf demo.tar.gz [文件]
-
解包解压:tar -zxvf demo.tar.gz
-
不解开直接看内容:tar -ztvf demo.tar.gz
-
权限的三个维度:人、事、物
-
访问者分类(Who)
-
Linux 将用户分为三类,决定了谁能操作文件:
-
文件所有者 (u --- User):文件的主人。
-
所属组 (g --- Group):文件所属的团队,组内成员享有组权限。
-
其他人 (o --- Others):既不是所有者也不在所属组内的用户。
-
-
-
文件属性解析(What)
-
通过 ls -l 查看,首位的 10 个字符决定了文件的性质和权限:
-
第 1 位:文件类型
-
-:普通文件(文本、可执行程序等)。
-
d:目录文件。
-
l:软链接(类似 Windows 快捷方式)。
-
b/c:块设备/字符设备文件。
-
-
第 2-10 位:权限组(每 3 位一组,依次为 u、g、o)
-
r (Read):读权限。
-
w (Write):写权限。
-
x (Execute):执行权限。
-
-:表示无对应权限。
-
-
-
权限值的表示与转换(逻辑实现)
-
字符表示法 vs 八进制表示法
-
模拟计算逻辑(代码演示)
场景:将文件权限设为 所有者(读写执行) 组(读执行) 其他(读)
字符法
chmod u=rwx,g=rx,o=r filename
八进制法 (4+2+1=7, 4+1=5, 4=4)
chmod 754 filename
默认权限与 umask 掩码计算(核心考点)
-
核心原理
-
Linux 预设了起始权限:普通文件 0666,目录文件 0777。
-
但实际创建出的文件权限会更小,这是因为受到了 umask(权限掩码)的过滤。
-
-
【模拟实现:权限计算公式】
-
权限的最终计算不是简单的减法,而是位运算:
- 最终权限 = 起始权限 & (~umask)
-
实例计算:
-
假设 umask 为 0022(取反后为 7755)。
-
新建目录起始权限 0777。
-
运算:0777 & (~0022) -> 111 111 111 & 111 101 101 = 111 101 101 -> 0755。
-
-
总结:umask 中出现的权限,在最终结果中一定会被抹去。
-
目录权限的特殊含义(易错点)
-
对于目录而言,rwx 的含义与普通文件截然不同:
-
r (Read):能否用 ls 查看目录下的文件名。
-
w (Write):能否在目录下新建、删除、重命名文件(极其重要:删除文件的权限由目录的 w 决定,而不是文件本身的权限)。
-
x (Execute):能否 cd 进入该目录。
-
-
【避坑指南】:如果你对目录有 r 没 x,你能看到文件名,但无法查看文件详情(如大小、权限),也无法进入。
粘滞位 (Sticky Bit):解决不安全隐患
-
产生背景
- 在公共目录(如 /tmp)中,大家都有 w 权限以便创建文件。但根据目录权限规则,张三可以删掉李四创建的文件,这极不安全。
-
解决方案
-
在目录权限中加入"粘滞位":chmod +t [目录名]。
-
效果:设置后,该目录下的文件只能由 root、目录所有者 或 文件所有者 删除。
-
表现:ls -l 查看时,其他人的执行位由 x 变为 t。
-
-
Linux 基础开发工具
软件包管理器:yum
-
核心概念
-
定义:Linux 下的"应用商店",负责安装、卸载和搜索软件包。
-
软件包 (Package):预先编译好的可执行程序,类似于 Windows 的 .exe 或 .msi。
-
rzsz 工具:用于 Windows 与 Linux 远程终端(如 XShell)之间传输文件。
-
rz:接收文件(上传到 Linux)。
-
sz:发送文件(下载到 Windows)。
-
-
-
操作指令
-
查看:yum list | grep [name] (结合 grep 筛选目标)。
-
安装:sudo yum install -y [name] ( -y 表示自动确认)。
-
卸载:sudo yum remove [name]。
-
-
优缺点
-
优点:自动处理库依赖关系(A 依赖 B 时,安装 A 会自动下 B);安装方便。
-
缺点:必须保证网络畅通;同一时间仅允许一个 yum 进程运行。
-
文本编辑器:vim
-
三大核心模式切换
-
命令模式 (Normal mode):启动时的默认模式,用于移动光标、删除、复制粘贴。
-
插入模式 (Insert mode):按 i、a 或 o 进入,用于文本输入。
-
底行模式 (Last line mode):在命令模式下按 shift + : 进入,用于保存、退出、替换。
-
-
常用命令集锦(命令模式下)
-
底行模式常用(: 之后)
-
w (保存), q (退出), wq (保存并退出), q! (强制退出不保存)。
-
set nu (显示行号), set nonu (取消行号)。
-
/关键字:由上往下找;?关键字:由下往上找。
-
-
vim 配置原理
-
配置文件位置:全局在 /etc/vimrc,私有在个人主目录 ~/.vimrc。
-
个性化定制:在 .vimrc 中写入 syntax on(语法高亮)、set shiftwidth=4(缩进)。
-
编译器:gcc / g++
-
程序编译的四个阶段
-
动态链接 vs 静态链接(重点)
-
动态链接 (Dynamic Linking):
-
后缀:.so (Linux), .dll (Windows)。
-
优点:可执行文件小,节省磁盘和内存空间。
-
缺点:运行时需保证库文件存在,否则无法运行。
-
备注:gcc 默认使用动态链接。
-
-
静态链接 (Static Linking):
-
后缀:.a (Linux), .lib (Windows)。
-
选项:编译时加 -static。
-
优点:无运行依赖,拷贝到哪都能跑。
-
缺点:生成的二进制文件非常庞大。
-
-
调试器:gdb
-
前提条件
- 源代码必须以 Debug 模式编译,即在 gcc 中加入 -g 选项(如:gcc -g test.c -o test)。
-
核心调试命令
-
l (list) 1:从第一行开始查看代码。
-
r (run):运行程序(相当于 F5)。
-
b (break) N:在第 N 行设置断点。
-
i b (info break):查看断点信息。
-
n (next):逐过程(跳过函数调用,F10)。
-
s (step):逐语句(进入函数内部,F11)。
-
p (print) 变量:查看变量当前值。
-
bt (backtrace):查看函数调用栈(查崩溃点神器)。
-
display/undisplay:常显示/取消常显示变量值。
-
项目自动化构建工具:make / Makefile
-
核心机制
-
依赖关系:指出目标文件依赖于哪些源文件。
-
依赖方法:指出如何根据源文件生成目标文件(必须以 Tab 键开头)。
-
-
伪目标 (.PHONY)
-
定义:.PHONY: clean。
-
作用:被声明的对象将不再检查"最近修改时间",即总是会被执行。通常用于清理工程。
-
-
示例实现:
- test:test.c
gcc test.c -o test
.PHONY:clean
clean:
rm -f test
- test:test.c
实战模拟实现:第一个程序"进度条"
-
预备知识
-
\r (回车):回到当前行的行首。
-
\n (换行):跳到下一行相同位置。
-
行缓冲区:C 语言的输出会先存在缓冲区,遇到 \n 或手动调用 fflush(stdout) 才会刷新到屏幕。
-
-
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main() {
char bar[102];
memset(bar, 0, sizeof(bar));
const char *label = "|/-\"; // 旋转光标
int i = 0;
while (i <= 100) {
// %-100s: 预留100字符宽度并左对齐
// \r: 回到行首,实现覆盖刷新
printf("[%-100s][%d%%][%c]\r", bar, i, label[i % 4]);
fflush(stdout); // 强制刷新缓冲区
bar[i++] = '#';
usleep(50000); // 微秒级休眠
}
printf("\n"); // 结束后换行,防止 shell 提示符覆盖
return 0;
}