【Linux系统编程】Shell与权限(1)——以说媒的角度带你了解Shell与操作系统内核

🎈主页传送门:良木生香
🔥个人专栏:《C语言》《数据结构-初阶》《鼠鼠的C++学习之路》《Linux系统编程》
🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离
前言:在上一篇 Linux 文章中我们又学习了一些 Linux 的基础指令,那么今天这篇文章我们就对 Linux 指令进行收尾,同时对下一个知识点做一个开头——Linux 权限。Linux 指令是非常多的,而且有非常多的组合,我们作为刚入门的小白,只用先掌握最主要的四十几个指令就行,后面如果遇到不会的功能我们再慢慢积累起来。只需要多练就能熟练使用这些指令,所以不用太担心,也不用特意去记忆和背诵。话不多说,我们直接开始~~~
一、file 指令——看穿文件的"真面目"
1.1 功能
查看文件的真实类型(不是看后缀名,而是读取文件内部的"魔数")。
1.2 用法
file 文件名
1.3 实战演示
现在我有一个还未编译的 .cpp 文件,使用 file 查看:

可以看到,系统识别出这是一个 C++ 源代码文件,编码格式是 UTF-8。
现在我将这个文件编译,得到一个可执行程序文件,再用 file 查看:

这次显示的信息就丰富多了:
- ELF 64-bit LSB executable:这是一个 64 位的 ELF 格式可执行文件
- x86-64:运行在 x86-64 架构上
- dynamically linked:动态链接(依赖共享库)
- interpreter /lib64/ld-linux-x86-64.so.2:程序加载器
- for GNU/Linux 3.2.0:编译时针对的 Linux 内核版本
- not stripped:符号表未剥离(方便调试)
💡 为什么 file 不看后缀?
因为文件后缀可以随意修改。比如把
photo.jpg改成photo.txt,用file查看它仍然是 JPEG 图片。file读取的是文件开头的魔数(Magic Number)——每种文件格式都有固定的标识字节。
1.4 更多示例
file /bin/ls
# 输出:/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV)
file /etc/passwd
# 输出:/etc/passwd: ASCII text
file photo.png
# 输出:photo.png: PNG image data, 1920 x 1080, 8-bit/color RGBA
二、tar 指令——Linux 的"打包压缩"神器
2.1 为什么需要 tar?
在 Linux 中,打包和压缩是两个概念:
| 操作 | 作用 | 类比 |
|---|---|---|
| 打包 | 把多个文件/目录合并成一个文件 | 把散落的文件装进一个箱子 |
| 压缩 | 把文件体积变小 | 把箱子里的空气抽掉 |
打包: file1 + file2 + dir1/ → archive.tar
压缩: archive.tar → archive.tar.gz(体积变小)
2.2 tar 核心选项速查
| 选项 | 全称 | 作用 |
|---|---|---|
-c |
create | 创建新归档 |
-x |
extract | 解压归档 |
-t |
list | 查看归档内容(不解压) |
-v |
verbose | 显示详细过程 |
-f |
file | 指定归档文件名(必须放最后) |
-z |
gzip | 用 gzip 压缩/解压(.tar.gz) |
-j |
bzip2 | 用 bzip2 压缩/解压(.tar.bz2) |
-C |
directory | 指定解压到某个目录 |
📌 口诀记忆:
c创建、x解压、t查看、v啰嗦、f文件名、zgzip、jbzip2。
2.3 实战:打包、压缩、解压一条龙
现在我有一个文件夹 test_zip:

打包并压缩:
tar -czf test_zip.zip test_zip
执行后得到压缩包:

解压压缩包:
tar -xzf test_zip.zip
⚠️ 注意:
tar默认解压到当前路径下。如果想解压到指定路径,需要加-C:
tar -xzf test_zip.zip -C /larry/test
2.4 常见文件后缀对应关系
| 后缀 | 含义 | 解压命令 |
|---|---|---|
.tar |
仅打包,未压缩 | tar -xvf |
.tar.gz / .tgz |
gzip 压缩 | tar -xzvf |
.tar.bz2 |
bzip2 压缩 | tar -xjvf |
.zip |
zip 格式 | unzip |
2.5 压缩的目的——文件传输
压缩的目的就是为了让文件能够更加快捷地传输。讲到这里,我们来复习一下 Linux 与 Windows 之间传输文件的指令:
| 指令 | 方向 | 说明 |
|---|---|---|
sz |
Linux → Windows | 通过 XShell 下载文件到本地 |
rz |
Windows → Linux | 通过 XShell 上传文件到服务器 |
scp |
Linux → Linux | 服务器之间安全复制文件 |
# scp 示例:将本地文件复制到远程服务器
scp test.zip larry@192.168.1.100:/home/larry/
三、bc 指令——命令行计算器
3.1 功能
Linux 系统自带的命令行计算器,支持浮点数运算。
3.2 用法
在终端输入 bc,自动进入交互模式:
$ bc
1 + 2
3
10 / 3
3 # 默认是整数除法
scale=2 # 设置小数位数为 2
10 / 3
3.33
quit # 退出 bc
3.3 在脚本中使用 bc
# 管道传入表达式
echo "1.2 + 3.4" | bc
# 输出:4.6
# 计算圆周率(-l 加载数学库)
echo "scale=10; 4 * a(1)" | bc -l
# 输出:3.1415926532
# 在变量中使用
result=$(echo "scale=2; 100 / 3" | bc)
echo $result
# 输出:33.33
3.4 bc 常用数学函数(加 -l 参数)
| 函数 | 说明 |
|---|---|
s(x) |
sin(x) |
c(x) |
cos(x) |
a(x) |
arctan(x) |
l(x) |
ln(x) |
e(x) |
e^x |
sqrt(x) |
平方根 |
四、uname 指令——查看系统信息
4.1 功能
查看计算机的详细信息,包括内核版本、系统架构等。
4.2 用法
uname -a # 显示所有信息

4.3 输出解读
| 字段 | 含义 | 示例值 |
|---|---|---|
Linux |
内核名称 | Linux |
VM-0-14-centos |
主机名 | VM-0-14-centos |
3.10.0-1160.71.1.el7.x86_64 |
内核版本 | CentOS 7 的 3.10 内核 |
#1 SMP |
编译信息 | 对称多处理器支持 |
x86_64 |
机器架构 | 64 位 x86 架构 |
GNU/Linux |
操作系统 | GNU/Linux |
4.4 分项查看
uname -s # 内核名称(Linux)
uname -n # 主机名
uname -r # 内核版本(最常用!)
uname -m # 机器架构(x86_64 / i686)
uname -o # 操作系统(GNU/Linux)
4.5 面试考点:计算机体系结构
面试时如果被问到:“你的计算机体系结构是什么?”
回答思路:计算机体系结构问的就是 CPU 使用的是什么架构。现在市面上主要是两种:
| 架构 | 特点 | 典型设备 |
|---|---|---|
| X86 | 高性能、功耗高 | 笔记本电脑、台式机、服务器 |
| ARM | 低功耗、高性能比 | 手机、平板、嵌入式设备 |
在 Linux 上查看架构:
uname -m
# 输出:x86_64(64 位 X86 架构)
五、热键——效率翻倍的秘密武器
5.1 常用热键速查
| 热键 | 作用 | 使用场景 |
|---|---|---|
Tab |
自动补全命令/文件名 | 输入 cd /ho 按 Tab → 自动补成 cd /home |
Tab ×2 |
显示所有可能的补全选项 | 输入 cd / 按两次 Tab → 列出根目录所有文件 |
Ctrl + C |
终止当前运行的程序 | 程序死循环或执行错了,赶紧停掉 |
Ctrl + D |
退出当前登录/关闭终端 | 相当于输入 exit 或 logout |
Ctrl + L |
清屏(光标移到顶部) | 屏幕太乱,清一下 |
Ctrl + A |
光标移到行首 | 改命令开头的参数 |
Ctrl + E |
光标移到行尾 | 改命令末尾的参数 |
Ctrl + U |
删除光标前的所有内容 | 整行输错了,快速删掉重来 |
Ctrl + K |
删除光标后的所有内容 | 只保留前半部分 |
Ctrl + W |
删除光标前的一个单词 | 删错了一个参数 |
↑ / ↓ |
翻看历史命令 | 不用重新输入,找之前的命令 |
Ctrl + R |
搜索历史命令 | 输入关键字,匹配历史命令 |
history |
查看最近执行的命令 | 默认显示最近 1000 条 |
!n |
执行历史记录中第 n 条命令 | !100 执行第 100 条历史命令 |
!! |
执行上一条命令 | 刚才的命令忘了加 sudo,输入 sudo !! |
5.2 最实用的组合技
# 场景:刚才执行了一条命令,发现忘了加 sudo
apt-get install vim
# 报错:Permission denied
# 解决:sudo + !!(!! 表示上一条命令)
sudo !!
# 等价于:sudo apt-get install vim
5.3 Linux 指令分类速览
Linux 指令非常多,下面按功能分类列出最常用的:
| 类别 | 常用指令 |
|---|---|
| 文件处理 | file、mkdir、grep、dd、find、mv、ls、diff、cat、ln |
| 系统管理 | df、top、free、quota、at、lp、adduser、groupadd、kill、crontab |
| 网络操作 | ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、mail、nslookup |
| 系统安全 | passwd、su、umask、chgrp、chmod、chown、chattr、sudo、ps、who |
| 其他工具 | tar、unzip、gunzip、unarj、mtools、man、unencode、uudecode |
💡 学习建议:不用刻意背诵,多练多用自然就记住了。遇到不会的指令,用
man 指令名查看手册。
六、Shell——以说媒的角度理解操作系统内核
6.1 广义操作系统 vs 狭义操作系统
在操作系统这个概念中,我们分为广义操作系统与狭义操作系统两个概念:
| 概念 | 定义 | 例子 |
|---|---|---|
| 广义操作系统 | 操作系统内核 + 应用程序软件 | 我们日常说的 “Windows”、“Linux” |
| 狭义操作系统 | 仅指操作系统内核(Kernel) | Linux Kernel、Windows NT Kernel |
广义操作系统大家都理解,所以今天我们要讲的是狭义操作系统。下面是基本框架的示意图:

从图中可以看到,用户并不是直接和内核打交道的,中间隔了一层 Shell(外壳)。
6.2 “王婆说媒”——Shell 的本质
我们该怎么理解 Shell 这层外壳呢?
想象这样一个场景:有一个不擅长和女生打交道的男主(这就是用户),他看上了村里的如花(这就是操作系统内核 Kernel)。但是男主害羞啊,不知道怎么跟如花搭话,更不知道怎么表达心意。
这时候,王婆(这就是 Shell)出现了。王婆是村里有名的媒婆,专门帮人说媒。男主把想法告诉王婆,王婆翻译成如花能听懂的话,去跟如花沟通。如花回应了,王婆再把回应翻译给男主听。

Shell 就是操作系统内核和用户之间的"翻译官"+“媒婆”:
- 用户输入的是人类能看懂的命令(如
ls、cd) - Shell 把这些命令翻译成内核能理解的系统调用
- 内核执行完后,Shell 再把结果翻译回人类语言展示给用户
6.3 Shell 是怎么"传话"的?
用专业的话来说,Shell 是命令行解释器(Command Line Interpreter),它的工作流程如下:
用户输入命令 → Shell 分析指令 → 交给内核执行 → 返回执行结果
↑ ↓
└──────────── 用户看到结果 ←────────────────┘
具体步骤:
- 读取(Read):Shell 读取用户输入的命令行
- 解析(Parse):把命令拆分成命令名和参数
- 查找(Find):在环境变量
PATH指定的目录中查找可执行文件 - 执行(Execute):通过系统调用让内核执行程序
- 返回(Return):收集程序的输出,显示给用户
# 例如用户输入:
ls -l /home
# Shell 的处理过程:
# 1. 解析出命令:ls,参数:-l, /home
# 2. 在 /bin/ls 找到可执行文件
# 3. 调用 execve() 系统执行 /bin/ls
# 4. 内核读取 /home 目录,返回文件列表
# 5. Shell 把结果格式化后显示给用户
6.4 Shell 的"保护机制"——拦截非法请求
Shell 还承担着保护内核的责任:
如果用户输入了"非法请求"(比如删除系统关键文件的命令),Shell 会在交给内核之前拦截下来。
就像王婆不会把"男主想欺负如花"这种话传过去一样,Shell 会过滤掉危险操作。
Shell 的保护机制包括:
| 机制 | 作用 |
|---|---|
| 命令解析检查 | 检查命令语法是否正确 |
| 权限检查 | 检查用户是否有权限执行该操作 |
| 路径检查 | 防止访问非法路径 |
| 环境隔离 | 每个用户有独立的环境变量和工作目录 |
6.5 Linux 的 Shell——bash
Linux 中最常用的 Shell 是 bash(Bourne Again Shell):
# 查看当前使用的 Shell
echo $SHELL
# 输出:/bin/bash
# 查看系统支持的所有 Shell
cat /etc/shells
# 输出:/bin/sh、/bin/bash、/usr/bin/bash 等
bash 的特点:
- ✅ 支持命令历史(按
↑↓翻历史命令) - ✅支持命令补全(按
Tab自动补全) - ✅ 支持脚本编程(把多个命令写成
.sh文件批量执行) - ✅ 支持管道(
|)和重定向(>、>>、<)
6.6 Windows 的 Shell——图形界面
Windows 也有 Shell,只是形式不同:
| 系统 | Shell 形式 | 交互方式 |
|---|---|---|
| Linux | 命令行(bash/zsh) | 输入文字命令 |
| Windows | 图形界面(GUI) | 点击图标、按钮 |
💡 本质一样:你双击"我的电脑",Windows 的 Shell(资源管理器)把这个操作翻译成内核调用,内核去读取磁盘信息,Shell 再把结果用图形展示出来。
Windows 的命令行 Shell:
Windows 也有命令行 Shell,比如:
- cmd.exe:传统的命令提示符
- PowerShell:功能更强大的现代 Shell
# Windows PowerShell 示例
Get-ChildItem # 相当于 Linux 的 ls
Set-Location C:\Users # 相当于 Linux 的 cd
七、总结速查表
| 指令/概念 | 一句话总结 | 最常用场景 |
|---|---|---|
| file | 看穿文件的真实类型(不看后缀) | 不知道文件是什么格式 |
| tar -czf | 打包并 gzip 压缩 | 备份、传输目录 |
| tar -xzf | 解压 .tar.gz | 解压下载的源码包 |
| bc | 命令行计算器,支持浮点数 | 脚本中做数学运算 |
| uname -a | 查看系统所有信息 | 查内核版本、系统架构 |
| uname -r | 只看内核版本 | 排查兼容性问题 |
| Tab | 自动补全命令/文件名 | 少打字、防拼错 |
| Ctrl+C | 终止当前程序 | 程序卡死了 |
| Ctrl+D | 退出登录/关闭终端 | 快速退出 |
| !! | 执行上一条命令 | 忘了加 sudo 时用 |
| Shell | 用户和内核之间的"王婆" | 理解操作系统架构 |
| bash | Linux 最常用的 Shell | 写脚本、日常命令 |
后记:Linux 的学习是一个循序渐进的过程。今天我们从 Shell 的本质出发,理解了用户-内核之间的交互模型;掌握了 file、tar、bc、uname 等实用工具;还学习了让效率翻倍的热键。下一篇我们将深入 Linux 权限管理,探索 root 和普通用户之间的权力游戏。
🌟 那么以上就是本次所有的内容了
文章是自己写的哈,有什么描述不对的、不恰当的地方,恳请大佬指正,看到后会第一时间修改,感谢您的阅读~ 🌟
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)