一、Shell的类型1.1 常见的Shell种类Linux的Shell种类众多常见的有Shell名称 路径 说明Bourne Shell /bin/sh UNIX最初使用的ShellBourne Again Shell /bin/bash Linux默认Shell由GNU开发C Shell /usr/bin/csh 语法与C语言相似K Shell /usr/bin/ksh 与sh兼容的Korn ShellBashBourne Again Shell是大多数Linux系统默认的Shell在日常工作中被广泛使用。1.2 查看当前使用的Shellbash查看当前使用的Shellecho $01.3 默认Shell的配置系统启动什么样的Shell程序取决于用户ID配置。在/etc/passwd文件中用户ID记录的第7个字段列出了默认的Shell程序。bash查看当前用户的默认Shellcat /etc/passwd | grep $USER1.4 脚本中的Shebang在Shell脚本的第一行#!/bin/bash表示此脚本使用/bin/bash来解释执行。#!是特殊表示符后面跟的是解释此脚本的Shell路径【PPT】。bash#!/bin/bash这是一个Bash脚本echo “Hello, World!”二、Shell的父子关系2.1 父Shell与子Shell的概念父Shell用户登录某个虚拟控制器终端或在GUI中运行终端仿真器时所启动的默认交互Shell。子Shell在CLI提示符后输入/bin/bash命令或其他等效的bash命令时会创建一个新的Shell程序。简单理解第一个看到的Shell是父Shell在父Shell上执行或产生的第二个/第N个Shell就是子Shell。2.2 创建子Shellbash进入子Shellbash查看当前Shell层级echo $SHLVL退出子Shellexit2.3 查看进程树结构使用ps --forest命令可以展示子Shell间的嵌套结构bash查看进程树ps --forest更详细的进程树查看ps -ef --forest2.4 检测子Shell使用环境变量$BASH_SUBSHELL可以判断是否存在子Shellbash在父Shell中echo $BASH_SUBSHELL # 返回0表示没有子Shell在子Shell中通过括号创建(echo $BASH_SUBSHELL) # 返回1表示存在子Shell嵌套子Shell( (echo $BASH_SUBSHELL) ) # 返回2BASH_SUBSHELL的值表示子Shell的嵌套深度0表示当前Shell不是子Shell1表示在第一层子Shell中2表示在第二层子Shell中以此类推。三、Shell的运行模式3.1 命令列表在命令之间加入分号;可以在一行中指定Shell要依次运行的一系列命令。bash命令列表依次执行三条命令pwd ; ls ; date这种方式只是简单的命令依次执行并不会创建子Shell。3.2 进程列表将命令列表包含在括号中会生成一个子Shell来执行对应的命令。bash进程列表在子Shell中执行(pwd ; ls ; date)验证是否创建了子Shellecho $BASH_SUBSHELL # 返回0(echo $BASH_SUBSHELL) # 返回1关键区别命令列表分号分隔在当前Shell执行不创建子Shell进程列表括号包裹创建子Shell执行3.3 命令分组花括号另一种命令分组方式是将命令放入花括号中但不会创建子Shellbash花括号分组注意花括号与命令之间必须有空格命令以分号结尾{ pwd; ls; date; }验证不会创建子Shell{ echo $BASH_SUBSHELL; } # 返回03.4 后台模式在命令末尾加上字符可以将命令置入后台模式bash后台运行sleep命令sleep 60 查看后台作业jobs查看后台作业及进程IDjobs -l3.5 后台进程列表将进程列表置入后台可以在子Shell中进行繁重处理同时不会让子Shell的I/O受制于终端bash后台执行进程列表(sleep 30; echo “Done”) 3.6 协程命令coproccoproc命令可以在后台生成一个子Shell并在这个子Shell中执行命令bash基本用法coproc sleep 10自定义协程名称注意语法格式coproc My_Job { sleep 10; }注意事项第一个花括号{和命令名之间必须有一个空格命令必须以分号;结尾分号和闭花括号}之间也得有一个空格【PPT】bash查看协程状态jobs四、内建命令与外部命令4.1 外部命令外部命令文件系统命令是存在于Bash Shell之外的程序通常位于/bin、/usr/bin、/sbin或/usr/sbin中。当外部命令执行时会创建出一个子进程这种操作被称为衍生forking。bash查找外部命令的位置which pswhich ls查看命令类型type pswhich命令只显示外部命令文件路径【PPT】。4.2 内建命令内建命令已经和Shell编译成了一体作为Shell工具的组成部分存在。它们不需要使用子进程来执行因此执行速度更快、效率更高。4.3 区分内建与外部命令使用type命令可以区分命令是内建还是外部bash查看命令类型type cd # cd is a shell builtintype ps # ps is /bin/pstype exit # exit is a shell builtin查看命令的所有实现-a选项type -a echo # 显示echo的所有实现内建和外部type -a pwd # 显示pwd的所有实现有些命令如echo、pwd既有内建命令也有外部命令两种实现略有不同。五、内建命令详解5.1 history命令history命令用于跟踪用户使用过的命令。bash查看命令历史history查看历史记录条数echo $HISTSIZE历史记录的存储命令历史记录保存在用户主目录的隐藏文件.bash_history中。重要特性Bash命令的历史记录先存放在内存中当Shell退出时当前终端窗口关闭时才被写入到历史文件中【PPT】。验证内存与文件的差异bash查看历史文件的内容上次退出Shell时的命令tail ~/.bash_history查看当前会话的历史包含本次输入的命令history | tail两者的区别.bash_history的末尾是上次退出Shell时的命令而history的末尾是本次会话实时输入过的命令【PPT】。强制写入历史文件bash强制将当前会话的历史写入.bash_historyhistory -a验证强制写入后.bash_history与history一致tail ~/.bash_history快速调用历史命令bash重新执行上一条命令!!执行历史中指定编号的命令假设编号为123!1235.2 alias命令alias命令允许为常用命令创建别名减轻输入量。bash查看所有已设置的别名aliasalias -p创建别名alias li‘ls -li’使用别名li删除别名unalias li注意命令别名属于内部命令一个别名仅在它所定义的Shell进程中有效【PPT】。永久保存别名将别名定义写入~/.bashrc文件可以使别名永久生效bash编辑.bashrc文件vim ~/.bashrc在文件中添加alias ll‘ls -al’alias li‘ls -li’使配置生效source ~/.bashrc六、知识点总结框架6.1 知识体系图text理解Shell├── 1. Shell的类型│ ├── Bourne Shell (sh)│ ├── Bourne Again Shell (bash) ← 默认│ ├── C Shell (csh)│ └── K Shell (ksh)├── 2. Shell的父子关系│ ├── 父Shell登录时启动的默认Shell│ ├── 子Shell通过bash命令创建│ ├── 检测$BASH_SUBSHELL0无子Shell│ └── 查看ps --forest├── 3. Shell的运行模式│ ├── 命令列表分号;依次执行│ ├── 进程列表括号()创建子Shell│ ├── 命令分组花括号{}不创建子Shell│ ├── 后台模式后台执行│ └── 协程coproc后台子Shell├── 4. 内建命令 vs 外部命令│ ├── 外部命令需衍生子进程如ps、ls│ ├── 内建命令无需子进程如cd、exit│ └── 查看type命令└── 5. 常用内建命令├── history命令历史│ ├── history -a强制写入│ ├── !!执行上一条命令│ └── !编号执行指定编号命令└── alias命令别名├── alias -p查看所有别名├── alias 别名‘命令’创建别名└── ~/.bashrc永久保存6.2 常用命令参数速查命令 常用参数 用途echo $0 无 查看当前Shell类型ps --forest -ef 查看进程树结构echo $BASH_SUBSHELL 无 检测子Shell层级type -a 查看命令类型及所有实现which 无 查找外部命令路径history -a 强制写入历史文件alias -p 查看所有别名jobs -l 查看后台作业及PID七、练习题练习题1history命令题目理解当Shell退出时history才写入.bash_history的机制。操作步骤打开终端输入几条命令使用history查看当前会话历史使用tail ~/.bash_history查看历史文件观察两者差异使用history -a强制写入再次查看.bash_history对比变化练习题2进程列表题目验证进程列表创建子Shell。操作步骤bash1. 在父Shell中查看BASH_SUBSHELLecho $BASH_SUBSHELL2. 在进程列表中查看(echo $BASH_SUBSHELL)3. 在嵌套进程列表中查看( (echo $BASH_SUBSHELL) )练习题3后台模式题目将sleep命令放入后台并查看状态。操作步骤bash1. 后台运行sleepsleep 30 2. 查看后台作业jobs3. 查看详细作业信息jobs -l
Linux Shell 完全理解:从类型到内建命令的全面指南
一、Shell的类型1.1 常见的Shell种类Linux的Shell种类众多常见的有Shell名称 路径 说明Bourne Shell /bin/sh UNIX最初使用的ShellBourne Again Shell /bin/bash Linux默认Shell由GNU开发C Shell /usr/bin/csh 语法与C语言相似K Shell /usr/bin/ksh 与sh兼容的Korn ShellBashBourne Again Shell是大多数Linux系统默认的Shell在日常工作中被广泛使用。1.2 查看当前使用的Shellbash查看当前使用的Shellecho $01.3 默认Shell的配置系统启动什么样的Shell程序取决于用户ID配置。在/etc/passwd文件中用户ID记录的第7个字段列出了默认的Shell程序。bash查看当前用户的默认Shellcat /etc/passwd | grep $USER1.4 脚本中的Shebang在Shell脚本的第一行#!/bin/bash表示此脚本使用/bin/bash来解释执行。#!是特殊表示符后面跟的是解释此脚本的Shell路径【PPT】。bash#!/bin/bash这是一个Bash脚本echo “Hello, World!”二、Shell的父子关系2.1 父Shell与子Shell的概念父Shell用户登录某个虚拟控制器终端或在GUI中运行终端仿真器时所启动的默认交互Shell。子Shell在CLI提示符后输入/bin/bash命令或其他等效的bash命令时会创建一个新的Shell程序。简单理解第一个看到的Shell是父Shell在父Shell上执行或产生的第二个/第N个Shell就是子Shell。2.2 创建子Shellbash进入子Shellbash查看当前Shell层级echo $SHLVL退出子Shellexit2.3 查看进程树结构使用ps --forest命令可以展示子Shell间的嵌套结构bash查看进程树ps --forest更详细的进程树查看ps -ef --forest2.4 检测子Shell使用环境变量$BASH_SUBSHELL可以判断是否存在子Shellbash在父Shell中echo $BASH_SUBSHELL # 返回0表示没有子Shell在子Shell中通过括号创建(echo $BASH_SUBSHELL) # 返回1表示存在子Shell嵌套子Shell( (echo $BASH_SUBSHELL) ) # 返回2BASH_SUBSHELL的值表示子Shell的嵌套深度0表示当前Shell不是子Shell1表示在第一层子Shell中2表示在第二层子Shell中以此类推。三、Shell的运行模式3.1 命令列表在命令之间加入分号;可以在一行中指定Shell要依次运行的一系列命令。bash命令列表依次执行三条命令pwd ; ls ; date这种方式只是简单的命令依次执行并不会创建子Shell。3.2 进程列表将命令列表包含在括号中会生成一个子Shell来执行对应的命令。bash进程列表在子Shell中执行(pwd ; ls ; date)验证是否创建了子Shellecho $BASH_SUBSHELL # 返回0(echo $BASH_SUBSHELL) # 返回1关键区别命令列表分号分隔在当前Shell执行不创建子Shell进程列表括号包裹创建子Shell执行3.3 命令分组花括号另一种命令分组方式是将命令放入花括号中但不会创建子Shellbash花括号分组注意花括号与命令之间必须有空格命令以分号结尾{ pwd; ls; date; }验证不会创建子Shell{ echo $BASH_SUBSHELL; } # 返回03.4 后台模式在命令末尾加上字符可以将命令置入后台模式bash后台运行sleep命令sleep 60 查看后台作业jobs查看后台作业及进程IDjobs -l3.5 后台进程列表将进程列表置入后台可以在子Shell中进行繁重处理同时不会让子Shell的I/O受制于终端bash后台执行进程列表(sleep 30; echo “Done”) 3.6 协程命令coproccoproc命令可以在后台生成一个子Shell并在这个子Shell中执行命令bash基本用法coproc sleep 10自定义协程名称注意语法格式coproc My_Job { sleep 10; }注意事项第一个花括号{和命令名之间必须有一个空格命令必须以分号;结尾分号和闭花括号}之间也得有一个空格【PPT】bash查看协程状态jobs四、内建命令与外部命令4.1 外部命令外部命令文件系统命令是存在于Bash Shell之外的程序通常位于/bin、/usr/bin、/sbin或/usr/sbin中。当外部命令执行时会创建出一个子进程这种操作被称为衍生forking。bash查找外部命令的位置which pswhich ls查看命令类型type pswhich命令只显示外部命令文件路径【PPT】。4.2 内建命令内建命令已经和Shell编译成了一体作为Shell工具的组成部分存在。它们不需要使用子进程来执行因此执行速度更快、效率更高。4.3 区分内建与外部命令使用type命令可以区分命令是内建还是外部bash查看命令类型type cd # cd is a shell builtintype ps # ps is /bin/pstype exit # exit is a shell builtin查看命令的所有实现-a选项type -a echo # 显示echo的所有实现内建和外部type -a pwd # 显示pwd的所有实现有些命令如echo、pwd既有内建命令也有外部命令两种实现略有不同。五、内建命令详解5.1 history命令history命令用于跟踪用户使用过的命令。bash查看命令历史history查看历史记录条数echo $HISTSIZE历史记录的存储命令历史记录保存在用户主目录的隐藏文件.bash_history中。重要特性Bash命令的历史记录先存放在内存中当Shell退出时当前终端窗口关闭时才被写入到历史文件中【PPT】。验证内存与文件的差异bash查看历史文件的内容上次退出Shell时的命令tail ~/.bash_history查看当前会话的历史包含本次输入的命令history | tail两者的区别.bash_history的末尾是上次退出Shell时的命令而history的末尾是本次会话实时输入过的命令【PPT】。强制写入历史文件bash强制将当前会话的历史写入.bash_historyhistory -a验证强制写入后.bash_history与history一致tail ~/.bash_history快速调用历史命令bash重新执行上一条命令!!执行历史中指定编号的命令假设编号为123!1235.2 alias命令alias命令允许为常用命令创建别名减轻输入量。bash查看所有已设置的别名aliasalias -p创建别名alias li‘ls -li’使用别名li删除别名unalias li注意命令别名属于内部命令一个别名仅在它所定义的Shell进程中有效【PPT】。永久保存别名将别名定义写入~/.bashrc文件可以使别名永久生效bash编辑.bashrc文件vim ~/.bashrc在文件中添加alias ll‘ls -al’alias li‘ls -li’使配置生效source ~/.bashrc六、知识点总结框架6.1 知识体系图text理解Shell├── 1. Shell的类型│ ├── Bourne Shell (sh)│ ├── Bourne Again Shell (bash) ← 默认│ ├── C Shell (csh)│ └── K Shell (ksh)├── 2. Shell的父子关系│ ├── 父Shell登录时启动的默认Shell│ ├── 子Shell通过bash命令创建│ ├── 检测$BASH_SUBSHELL0无子Shell│ └── 查看ps --forest├── 3. Shell的运行模式│ ├── 命令列表分号;依次执行│ ├── 进程列表括号()创建子Shell│ ├── 命令分组花括号{}不创建子Shell│ ├── 后台模式后台执行│ └── 协程coproc后台子Shell├── 4. 内建命令 vs 外部命令│ ├── 外部命令需衍生子进程如ps、ls│ ├── 内建命令无需子进程如cd、exit│ └── 查看type命令└── 5. 常用内建命令├── history命令历史│ ├── history -a强制写入│ ├── !!执行上一条命令│ └── !编号执行指定编号命令└── alias命令别名├── alias -p查看所有别名├── alias 别名‘命令’创建别名└── ~/.bashrc永久保存6.2 常用命令参数速查命令 常用参数 用途echo $0 无 查看当前Shell类型ps --forest -ef 查看进程树结构echo $BASH_SUBSHELL 无 检测子Shell层级type -a 查看命令类型及所有实现which 无 查找外部命令路径history -a 强制写入历史文件alias -p 查看所有别名jobs -l 查看后台作业及PID七、练习题练习题1history命令题目理解当Shell退出时history才写入.bash_history的机制。操作步骤打开终端输入几条命令使用history查看当前会话历史使用tail ~/.bash_history查看历史文件观察两者差异使用history -a强制写入再次查看.bash_history对比变化练习题2进程列表题目验证进程列表创建子Shell。操作步骤bash1. 在父Shell中查看BASH_SUBSHELLecho $BASH_SUBSHELL2. 在进程列表中查看(echo $BASH_SUBSHELL)3. 在嵌套进程列表中查看( (echo $BASH_SUBSHELL) )练习题3后台模式题目将sleep命令放入后台并查看状态。操作步骤bash1. 后台运行sleepsleep 30 2. 查看后台作业jobs3. 查看详细作业信息jobs -l