Shell 是操作系统内核的外壳程序,Shell作为用户与内核交互的桥梁,并非 Linux 专属。在Windows操作系统上,我们就经常用到Shell程序:如我们经常使用的Windows资源管理器,就是具有图形界面的Shell程序。进行网络故障排除时,就要用到Windows系统的终端交互界面,CMD运行在该终端内,CMD就是一个没有图形界面的Shell程序,用户输入ping、ipconfig 等命令后,CMD 解析指令、调用系统内核执行操作,最后将运行结果返回终端展示给用户。相对Windows操作系统来说,Linux操作系统的Shell程序是操作系统的核心组成部分,不再是单纯附带的工具程序,Windows 仅预装 CMD、PowerShell 两种命令行 Shell;而 Linux 原生提供多种成熟 Shell,如bash、sh等Shell程序。Windows 图形界面优先级更高,无 CMD 也能正常使用桌面;Linux 从开机启动、服务加载、用户登录、服务器运维都离不开 Shell。Windows 日常操作主要依靠图形 Shell,命令行只是备用工具,而 Shell 是 Linux 的核心交互工具,服务器运维更是完全依赖命令行 Shell。所以学习 Linux,要先从 Shell 开始入门。一、什么是Shell交互
Linux系统开机后,默认启动Shell程序(绝大多数系统默认是bash),我们看到的黑色命令行窗口,就是Shell的交互界面。- 输入指令:用户在命令行输入Shell命令(比如查看文件、创建文件夹);
- Shell翻译:Shell把用户输入的命令,翻译为Linux内核能识别的指令;
- 返回结果:内核执行完成后,通过Shell把命令执行的结果输出到Shell窗口。
下面这张图展示了Shell执行[cp file.txt backup/]命令的执行过程。第一阶段:用户输入命令
用户在Shell的交互界面输入要执行的命令[cp file.txt backup/],该命令将当前目录下的file.txt文件复制到backup目录中,Shell接收到这个输入后开始对命令进行处理。Shell会按空格分割用户输入的命令字符串,识别出命令的三个部分:命令 cp、源参数 file.txt、目标参数 backup/,同时判断这是一个外部命令(cp是独立可执行程序,不是Shell内置命令),并在系统路径中找到cp的可执行文件位置。Shell会把解析好的命令和参数整理成系统调用要求的格式,准备传递给内核。Shell通过系统调用,触发内核,请求内核执行实际的文件复制操作。第二阶段:内核执行文件复制操作
内核是操作系统的核心,负责直接操作硬件和资源,实际完成文件复制的核心操作。内核通过open/read/write等系统调用,打开源文件file.txt,读取文件内容到内存缓冲区,再将内容写入到目标路径backup/下新建的file.txt,完成文件内容的复制。内核会在backup目录下,为新复制的文件创建索引条目(包括文件元信息,文件名、权限、存储位置等),让系统可以找到这个新文件。复制操作完成后,内核会把执行结果状态返回给Shell。如果复制成功,会返回成功标识;如果失败(目标目录不存在、权限不足等),则会返回对应的错误码。第三阶段:输出执行结果
Shell拿到内核返回的执行结果后,会将结果转换为用户易懂的格式输出到交互界面。本命令的执行结果输出内容为“1 file copied”,表示已经成功复制了1个文件,至此命令执行流程结束。简单来说,所有Linux命令行操作,都是Shell和系统的交互,没有Shell,用户无法直接操作Linux内核。二、Shell、终端、Linux 内核三者的关系
我们在学习Linux时,经常混淆Shell、终端和内核三个概念,很多同学都认为三者是同一个东西。实际上,Shell、终端和内核是三个不同的概念,他们相互协作、各负其责,形成了Linux系统的完整的人机交互链路。上图清晰描述了Linux操作系统中终端、Shell、内核的分层定位与交互流程,下面我们详尽解读Shell、终端和内核的区别。1、终端
终端本质上是用户和系统进行交互设备的抽象。早期的物理终端是独立的输入输出硬件(键盘+显示器),现代图形化系统中,终端是模拟硬件终端功能的软件程序,它仅负接收接用户的键盘输入,把输入内容转发给后端程序,同时把后端返回的处理结果渲染输出到显示器,终端本身不处理命令逻辑。2、Shell
Shell在英文中就是外壳的意思,它包裹在内核之外,是操作系统提供给用户的交互接口与命令解释器,它是沟通用户与内核的桥梁。用户输入的文本命令对内核来说无法直接识别,Shell会对命令做语法解析、参数拆分、环境变量替换,将其转换为内核可以识别的系统调用请求,并调用内核接口执行命令,执行完成后再把内核返回的结果整理为可读格式,返回给终端显示。你打开 Linux、macOS 终端敲命令时,背后干活的翻译官就是 Shell,当前主流的Shell版本就是Bash,它是Linux 装机标配大众款(GNU/Linux 默认),绝大多数Linux系统,如CentOS、Ubuntu等系统装好就自带Bash程序,属于通用百搭款,90% 的线上脚本、Linux运维教程全用它。例如写批量清理日志的脚本、循环遍历文件夹、部署后端服务,定时任务 crontab 脚本,全是 Bash 语法。3、内核
内核是操作系统最底层的核心部分,直接管理系统所有硬件与资源,是所有软件都依赖的底层基础。内核运行在最高特权级,普通用户程序无法直接访问内核,必须通过系统调用接口和内核交互,Shell就是帮用户发起系统调用的中间程序。简单来说,终端是窗口,负责看得见的输入输出;Shell是翻译,负责解析和转发命令;内核是核心,负责真正执行所有系统操作。三者相互依赖,缺一不可。三、.两种 Shell 运行模式:交互模式 & 脚本模式
Shell有两种工作状态,分别对应我们日常手动操作和自动批量执行两种场景。1、交互模式:人机实时对话,敲一条执行一条
这是我们打开终端最常见的模式,全程人机交互、即时响应。简单说:你手动打开终端窗口,屏幕上出现命令行提示符,你敲一行命令、回车,Shell 立刻执行、马上返回结果,等待你的下一次输入。交互模式的特点是对命令实时应答,逐条执行,不会批量运行代码;出错即时提示,输错命令马上报错,并可以实时查看帮助文档;适合手动调试、临时操作、排查问题。2、脚本模式:批量自动运行
脚本模式不需要人工干预,提前把一堆命令、逻辑、循环判断写进 .sh 脚本文件,一键批量自动跑完所有流程,相当于给 Shell 写好一套 “自动化作业流程”。例如在日常Linux运维中,需要每天定期清理过期日志,若运维人员每天都通过交互模式来完成过期日志清理工作,就会给运维人员带来繁重的工作。在这种情况下,可以把清理过期日志的命令写到一个脚本文件里,并设置该脚本文件每天在固定时间运行,就可以让系统自动完成过期日志的清理工作。下面是一个清理过期日志的脚本文件,文件命令可以是clean_log.sh。#!/bin/bash#保留7天日志,删除/var/log下7天前的日志文件find /var/log -type f -mtime +7 -deleteecho "日志清理完成:$(date)" >> /var/log/clear_log_record.log
下面代码配置 crontab 每日凌晨 2 点自动执行clean_log.sh脚本文件。#编辑定时任务crontab -e#添加定时规则:每日02:00执行清理脚本0 2 * * * /root/clear_log.sh
crontab 是Linux系统自带的定时任务管理工,专门用于设置、查看、删除周期性自动执行的任务,是运维自动化最基础的程序。四、上手实操:终端基础交互命令
理解了Shell、终端和内核三者之间的关系后,我们可以通过Linux最基础的终端命令进行实操练习。所有Shell交互的核心都是“输入命令、回车执行、查看结果”三个过程。1.快捷键
终端和Shell提供了一些快捷键,可以提高命令的输入效率,下面是常用的快捷键:- Tab键(Shell提供):用于自动补全命令、文件名、目录名,避免手动输入出错,连续按两次Tab可查看所有匹配内容
- 上下方向键(终端提供):用于快速调取、切换历史执行过的命令,仅刷新界面展示,不依赖Shell解析
- Ctrl + L(终端提供):快速清空终端屏幕,仅隐藏历史内容、刷新界面,不会修改当前操作环境与命令状态
- Ctrl + C(Shell提供):用于终止当前正在终端执行的命令、退出卡死或异常运行的进程
2.基础交互命令
以下命令是Linux终端最基础的交互命令,覆盖查看目录、切换路径、创建文件、查看内容等核心基础操作,所有命令均在Shell交互模式下直接执行。执行结果:会输出当前目录的绝对路径,帮助用户明确当前操作位置。功能:用于查看当前目录下的所有文件、文件夹,以列表方式展示文件和文件夹。执行结果:以列表方式输出当前目录下所有的目录和文件。示例1:cd test ,进入当前目录下的test文件夹。示例2:cd .. ,快速退出当前目录,回到上级目录。示例:mkdir study ,在当前目录创建名为study的文件夹。功能:在终端输出自定义文字,常用于测试Shell交互效果,也是后续脚本编程的基础输出指令。执行结果:终端直接打印出 Hello Linux。五、.简单认识 Shell 脚本
前面我们练习的基础交互命令,都属于Shell交互模式:输入一条、执行一条,交互模式适合临时操作。如果需要频繁、批量地执行命令,使用交互模式显然是非常不方便的,在这种情况下,就需要使用Shell脚本,Shell 脚本可以把多条 Linux 命令提前写入一个文件中,一次性交给 Shell 批量自动执行,不需要手动逐条输入,这也是 Shell 脚本最核心的作用:自动化、批量执行操作。1.Shell脚本基础规则
在编写Shell脚本之前,我们先简单了解一下编写Shell脚本的基本规则。第1个规则,Shell脚本是一个纯文本文件,可通过vi、vim等任意文本编辑器来编写,既然是文件就有扩展名,.sh是行业通用的推荐扩展名,但并非强制要求,你也可以使用其它的扩展名。第2个规则,脚本的第1行必须要声明脚本使用的解释器,告诉操作系统使用哪个程序来解析和执行脚本中的代码。例如,#!/bin/bash 告诉系统使用 Bash Shell解释器,#!/usr/bin/python3 告诉系统使用 Python 3 解释器。第4个规则,直接通过./脚本名的方式来运行脚本时,必须先通过chmod +x等命令赋予脚本文件可执行权限;如果直接用bash 脚本名的方式调用解释器运行,则无需提前赋予执行权限。2.编写第1个脚本
这是一个最简单的脚本案例,类似C语言经典的 Hello World 标准代码。我们利用前面学过的 echo 命令,来实现自定义内容的输出。在文件中写入以下代码,第1行声明解释器,第2为注释,第2行执行输出命令:默认创建的脚本没有执行权限,需通过终端输入命令授权:运行结果:终端自动打印 欢迎学习Linux Shell脚本,脚本执行完成。下面我们来编写一个简单实用的脚本,具体功能是在脚本所在目录创建一个shell_demo目录,在目录内生成 test.txt 文件并写入指定文本,最后使用echo指令在终端输出成功提示。#!/bin/bash#自动创建目录和文件,并写入内容mkdir shell_demoecho "Shell脚本可以批量自动执行命令" > shell_demo/test.txtecho "文件创建并内容写入成功!"
代码内的 mkdir shell_demo 使用的是相对路径,没有指定绝对路径,默认规则为:在哪执行脚本,就在哪创建文件夹,也就是脚本所在的当前目录。4.小结
脚本的运行逻辑和终端交互命令完全相同,脚本内的所有命令,最终都会交给 Shell 解析翻译,转发给内核执行,最后将执行结果通过终端展示。他们的唯一区别是:交互模式手动逐条执行,脚本模式自动批量执行。六、小结
总体来说,终端是窗口,负责看得见的输入输出;Shell是翻译,负责解析和转发命令;内核是核心,负责真正执行所有系统操作。三者相互依赖,缺一不可。