Xshell六

📅 2026/7/7 10:46:32 👁️ 阅读次数 📝 编程学习
Xshell六

一、Shell的类型
Shell是用户和Linux内核之间的沟通桥梁,按照启动方式和使用场景可以划分成四种类型,分别是交互式、非交互式、登录Shell、非登录Shell。
交互式Shell就是我们通过Xshell远程登录之后正常使用的终端环境,带有命令提示符,可以手动逐行输入指令,系统即时给出运行反馈,同时支持命令别名、历史命令回溯、Tab补全等交互功能。
非交互式Shell一般伴随Shell脚本运行而产生,在执行 .sh 脚本的时候自动开启,不需要人为手动输入指令,程序会依照脚本从上至下自动依次执行语句,不存在交互提示符。
登录Shell产生于账号登录环节,不管是SSH远程登录还是本机账号登录,初次进入系统的顶层Shell就是登录Shell,它会完整加载全局配置文件以及用户专属的环境配置文件。我们也可以输入 bash --login 手动创建一个登录Shell。而非登录Shell是已经登录系统之后额外创建出来的,比如新开终端窗口、直接输入bash指令唤起的新Shell进程,它只会加载局部配置文件,不会读取登录阶段的环境参数。
二、Shell进程以及父子关系
每一个Shell本质都是独立的进程,由此衍生出父Shell和子Shell的概念。我们登录之后最先拥有的终端进程就是父Shell,后续由它衍生开辟出来的新Shell进程,全部称为子Shell。子Shell会完整复制父Shell当下的环境变量数据,但是二者的内存空间相互隔离。如果在子Shell里面修改路径、自定义变量,操作结束退出之后,父Shell原本的数据不会发生任何改变。容易创建子Shell的操作有圆括号命令分组、管道符运算、后台任务运行、直接运行脚本文件。可以依靠系统变量 $BASH_SUBSHELL 判断层级,数值为0代表父Shell,数字大于零时则代表子Shell,数值大小对应嵌套层数。我们可以使用 ps --forest 命令,以树形结构直观查看所有进程之间的父子从属结构,清晰分辨PID之间的上下级关系。
三、Shell的父子关系补充特性
使用圆括号包裹指令执行一定会生成子进程,与之对比,大括号仅用作命令分组,并不会创建子Shell,内部的所有操作都会直接作用在父Shell环境里。
生命周期具备联动性,一旦手动关闭父Shell执行exit退出命令,所有依附它运行的子Shell进程也会随之一同结束运行。
四、Shell的运行模式
第一种为顺序执行模式,依靠分号分隔多条命令,能够在一行之内依次执行多个指令,全程都在父Shell之中串行运行,不会开辟新进程。格式示例: pwd ; ls ; whoami。
第二种为子Shell运行模式,将多条命令放置在圆括号内部执行,单独开辟子环境运行任务,在子Shell中切换工作目录,不会改动外层终端原本的路径位置。
第三种是后台运行模式,在整条命令的末尾添加符号 & ,任务就会转入后台静默运行。终端不需要长时间等待程序结束,可以立刻释放命令输入光标,继续执行别的操作。
配套管理指令:jobs可以查看当前全部后台任务,jobs -l可以额外展示任务对应的进程编号;fg能够把后台任务切换至前台运行,bg可以将暂停的任务重新在后台启动,kill命令可以根据任务编号或者PID结束进程。
五、内建命令与外部命令
内建命令直接内嵌在Shell程序本体当中,调用的时候不需要创建新进程,运行速度更快。常见的包含history、alias、cd、exit、echo等指令,可以输入 type + 命令名 来查验命令属性。
外部命令是存放在磁盘当中独立的可执行文件,每次调用都会新建一个子进程来完成运行,开销相对更大。ls、cat、mkdir、ps都属于外部命令,可以借助which命令查询它的文件存放路径。
二者最核心的差别就是进程创建机制,内建命令依托当前Shell直接运行,外部命令必须fork出新进程才可以正常执行。
六、内建命令history原理
history命令主要作用是记录终端会话里全部输入过的历史指令,命令记录会先临时存放在内存当中,系统默认只有在正常关闭终端会话时,才会自动把内存里的数据保存到隐藏文件 .bash_history 之中。
1. history 和 cat .bash_history 的输出差异
history调取的是内存里的数据,可以看到本次登录之后刚刚输入的所有命令,输出内容自带行编号,能够使用!加行号快速重复执行历史指令。
cat .bash_history读取磁盘上的文件,仅保存上一次会话结束之后留存的命令,无法查看本次还未退出终端的新指令,输出只有纯命令文本,没有行号标识。
2. 执行history -a之后产生的变化
参数 -a 代表追加写入,执行这条指令之后,会把当前内存中还没有落盘的命令,立刻追加保存到.bash_history文件里面,不用等到关闭终端。执行完毕再次cat查看文件,文件末尾会新增本次会话全部操作记录,磁盘文件内容和内存里的历史记录就会保持一致。
拓展常用参数:history 后面加上数字,可以只展示末尾指定条数的历史记录;history -w会直接用当前内存记录覆盖磁盘历史文件;history -r可以把磁盘里的历史文件重新读取加载进内存;history -c能够清空内存中全部的历史命令缓存。
同时还有快捷调用方式,!!可以直接重复执行上一条命令,!加上开头关键词,可以调取匹配前缀最近的一条历史命令运行。
七、内建命令 alias 别名用法
1.alias属于Shell内建命令,主要功能就是给冗长的命令设置自定义简写别名,减少重复输入的工作量。
2.直接输入alias不加参数,能够查看系统目前已经配置好的全部别名。临时别名的设置格式为 alias 别名='完整原命令',设置完成之后当下终端可以直接使用简写名称运行指令,缺点是会话关闭之后配置就会失效。

八、成果截图