Linux Shell全面学习实操总结
这次小学期围绕Shell完成了整套学习与实操,全程在Xshell远程连接Linux环境完成所有命令测试,把Shell相关的基础概念、进程关系、运行模式、命令分类都梳理清楚,也整理了完整实操过程与对应的现象,方便后续复盘回顾。Shell本身是用C语言编写的程序,相当于我们和Linux操作系统内核沟通的桥梁,它不只是平时敲命令交互的工具,还能作为编程语言编写后缀为.sh的脚本文件,脚本第一行一般会写上#!/bin/bash,这个特殊标识用来告诉系统使用bash解释器运行脚本,换成#!/bin/sh在多数场景下也能正常使用,甚至还能替换成python的解释器路径执行其他类型脚本。Linux系统里能使用的Shell种类并不单一,常见的有sh、bash、csh、ksh、dash等,其中bash是绝大多数发行版默认使用的Shell,用户登录终端时自动启动的Shell类型由/etc/passwd文件控制,文件每行的第七个字段记录了对应账号的默认解释器,输入cat /etc/passwd | grep 自己用户名就能查看配置,也可以用ls -LF /bin/*sh浏览系统内全部可用Shell程序,想要临时切换其他Shell直接输入对应程序路径即可,比如/bin/dash,执行exit就能切回上一层Shell。
登录终端后自动启动的交互Shell称为父Shell,只要在命令行输入bash,系统就会生成全新的子Shell,重复执行bash会形成多层嵌套的子进程结构,想要直观查看进程之间的父子嵌套关系可以使用ps --forest命令,输出内容里PID代表进程编号,PPID记录当前进程的父进程编号,每执行一次exit就会逐层关闭子Shell,回到上一级父进程。我们可以借助环境变量$BASH_SUBSHELL判断当前是否处于子Shell环境,变量输出数字为0代表没有新建子Shell,数值大于0则代表存在子Shell,数字大小对应嵌套层级,用分号分隔多条命令顺序执行不会创建子Shell,输出变量值始终是0,如果把整套命令包裹在括号内执行,系统会单独生成子Shell运行括号里的内容,变量数值会变为1,多层括号嵌套数值还会继续增加。
Shell支持多种运行模式,日常最常用的后台模式只需要在命令末尾添加&符号,程序就会放到后台执行,不会占用当前终端输入权限,执行sleep 60 &这类测试命令后,jobs可以查看所有后台任务,ps -f能够查看系统完整进程列表,后台任务运行结束后按下回车,终端会自动打印任务完成提示,把带括号的进程列表放到后台运行,还能避免子Shell的输入输出绑定当前终端,适合执行耗时较长的批量操作。除了普通后台任务,Shell还提供coproc协程功能,同样会在后台创建独立子Shell执行命令,不指定名称时进程默认标识为COPROC,如果想要自定义协程名称要遵守固定语法,花括号前后、命令末尾分号后方都必须保留空格,标准写法为coproc 自定义名称 { 执行命令; },运行后搭配jobs -l可以查看协程进程详细信息。
Linux里所有命令分为内建命令和外部命令两类,外部命令是独立存放在/bin、/usr/bin等目录下的可执行文件,像ps就属于典型外部命令,执行外部命令时系统会通过fork创建全新子进程,会产生一定性能开销,我们可以用which或者type -a查询外部命令存放路径,which指令只能检索磁盘上的外部程序,无法识别Shell内置指令。内建命令直接编译集成在Shell程序内部,运行时不需要新建子进程,执行速度更快,cd、exit都是纯内置命令,echo、pwd比较特殊,同时存在内置版本和外部程序版本,输入type -a 命令名可以完整展示一条命令的所有实现形式,清晰区分内置与外部程序。
history是非常实用的内置命令,能够记录终端所有输入过的指令,所有操作记录先临时存放在内存中,只有关闭终端、执行exit退出当前Shell会话时,内存里的记录才会写入用户家目录下的隐藏文件.bash_history,直接用tail查看这个文件,只能看到上一次会话结束前保存的命令,而history读取内存,会展示当前终端全部实时输入内容,两者输出内容会存在明显差异,执行history -a可以强制把内存里的全部历史命令写入文件,执行完成后再次读取.bash_history,文件内容就会和history输出完全同步。同时history支持快捷调用历史指令,输入!!可以直接执行上一条命令,!加上命令编号就能调取对应序号的历史操作,搭配history | grep 关键词还能快速筛选需要的历史记录。
alias也是高频使用的内置命令,核心作用是给冗长的常用命令自定义简短别名,减少重复输入,输入alias -p能够查看系统预先配置好的全部别名,系统自带ll、la、ls等简化指令,ll等价于ls -alF,还自带彩色输出参数方便查看文件信息,自定义别名语法为alias 别名=‘完整命令及参数’,比如alias myls=‘ls -li’,创建完成后直接输入自定义名称就能执行对应命令,需要注意别名仅在当前Shell会话内生效,切换新终端或者新建子Shell后,自定义别名会失效,不会影响其他用户的Shell配置。
整套实操全部在Xshell环境完成,每一类知识点都配套对应的操作指令与运行截图,把Shell类型、父子进程、运行模式、内外命令区分、history和alias两个核心内置命令的用法完整串联起来,搭建起清晰的知识框架,每条命令都标注了对应的用途和关键参数作用,也完成了课程要求的history对比实验,先观察history与.bash_history输出差异,再执行history -a对比文件内容变化,所有实操内容整合后整理成这篇学习记录,满足本次课程作业的全部要求,后续只需要把文章发布到CSDN,提交文章链接即可完成作业。