子Shell
概念
Shell子进程,Shell脚本是从上至下,从左至右依次执行每一行的命令及语句的
,即执行完一个命令之后再执行下一个。如果在shell脚本中遇到子脚本(即脚本嵌套),就会先执行子脚本的内容,完成后再返回父脚本继续执行父脚本内后续的命令及语句
子shell常见产生途径
由&产生的子Shell
【特点】
- 在Shell中使用"&"可以产生子Shell
- 由"&"产生的子Shell可以直接引用父Shell定义的本地变量
- 由"&"产生的子Shell中定义的变量不能被父Shell引用
- 在shell中使用"&"可以实现其他程序的多线程并发功能
由 管道 产生的子Shell
【特点】
- 在shell中使用管道可以产生子Shell
- 由管道产生的子Shell可以直接引用父Shell定义的本地变量
- 由管道产生的子Shell中定义的变量不能被父Shell引用
- 由管道产生的子shell不能异步执行,只能在执行完毕后才能返回到父Shell环境
由() 产生的子Shell
【特点】
- 在shell中使用()可以产生子Shell
- 由()产生的子Shell可以直接引用父Shell定义的本地变量
- 由()产生的子Shell中定义的变量不能被父Shell引用
- 由()产生的子shell不能异步执行,只能在执行完毕后才能返回到父Shell环境
由外部shell脚本产生的子Shell
【特点】
- 在shell中使用()可以产生子Shell
- 调用外部shell脚本产生的子Shell,可以直接引用父Shell定义的本地变量
- 调用外部shell脚本产生的子Shell中定义的变量(或者环境变量),不能被父Shell引用
- 调用外部shell脚本产生的子Shell不能异步执行,只能在执行完毕后才能返回到父Shell环境
Shell调用脚本模式
在主脚本中嵌套脚本的方式有很多,常见为fork,exec,source三种模式
fork模式调用脚本
fork模式是最普通的脚本调用方式,即直接在父脚本里面用"/script.sh"来调用脚本
SubShell可以从ParentShell继承环境变量,但是默认情况下SubShell中的环境变量不能带回ParentShell
exec模式调用脚本
exec模式不需要新开一个SubShell来执行被调用的脚本。被调用的脚本与父脚本在同一个Shell内执行,但是使用exec调用一个新脚本以后,父脚本中exec执行之后的脚本内容就不会再执行
source模式调用脚本
source模式,不会新开一个SubShell来执行被调用的脚本,而是在同一个Shell中执行,所以在被调用的脚本中声明的变量和环境变量都可以在主(父)脚本中获取和使用
source模式与exec模式相比,最大的不同在使用source调用一个新脚本以后,父脚本中source命令行之后的内容在子脚本执行完毕后依然会被执行