5.1 shell 的类型
对bash shell脚本来说,有两种不同的shell:
-
默认的交互shell(系统启动什么样的shell程序取决于个人的用户ID配置)
在etc/passwd文件中,在用户ID记录的第7个字段中列出了默认的shell程序。 bash shell程序位于/bin目录内。
/bin/bash*是一个可执行程序
CentOS发行版还有一些其他shell程序,包括tcsh(源自最初的C shell);ash shell的Debian版 dash。
- 默认的系统shell:/bin/sh (用于那些需要在启动时使用的系统shell脚本)
Ubuntu发行版中,默认的系统shell(dash shell)和默认的交互shell(bash shell )并不相同。
输入命令/bin/dash:启动dash shell;exit来推出dash shell。
5.2 shell的父子类型
默认的交互shell:父shell
输入/bin/bash命令或其他等效的bash命令是,会创建一个新的shell程序,成为子shell。
bash命令:生成子shell,并且shell可以套shell,exit退出shell。
输入bash, 生成子shell时看不到任何信息,命令ps -f 查看进程来看父子shell; ps --forest命令查看子shell间嵌套结构。
5.2.1 进程列表
在一行中指定要依次运行的一系列命令可以用命令列来实现:在命令之间加入分号 ; 即可。
加入 ( ) 使得命令列表变成进程列表,生成了一个子shell来执行对应的命令。
想知道是否生成了子shell,借助命令echo $BASH_SUBSHELL,返回0,表明没有子shell,返回1或更大数字,表明存在子shell。
5.2.2 别处心裁的子shell用法
-
探索后台模式
sleep命令:进程等待/睡眠的秒数
末尾加字符&:将命令置入后台模式
jobs命令:显示当前运行在后台模式中的所有用户的进程。 -
将进程列表置于后台
-
协程
coproc命令:协程处理
5.3 理解shell的内建命令
5.3.1 外部命令
外部命令:文件系统命令,存在于bash shell之外的程序,常位于/bin、/usr/bin、/sbin、/usr/sbin中。
举例:ps就是一个外部命令,可以用which和type命令找到它。
当外部命令执行时,会创建出一个子进程,这种操作成为衍生。
5.3.2 内建命令
和shell编译成一体,不需要借助外部程序文件来运行。
cd和exit命令都内建于bash shell。
- 使用history命令(查看最近用过的命令列表)
输入!!时,bash首先会显示出从shell的历史记录中换回的命令,然后执行该命令。 - 命令别名 alias(运行为常用命令创建另一个名称,减少输入量)
5.4 小结
- 默认的交互式shell和系统shell(/bin/bash和/bin/sh)
- 子shell:bash生成,coproc也可以。
- 外部命令和内建命令(外部命令会创建出一个包含全新环境的子进程)
网友评论