深入了解Korn Shell:子shell与环境定制
1. 子shell的奥秘
在Korn Shell中,协程代表了进程间最复杂的关系。而现在,我们将聚焦于一种更为简单的进程间关系——子shell与其父shell的关系。当你运行一个shell脚本时,实际上会调用主(父)shell进程的一个子进程,也就是另一个shell副本。下面我们来详细了解一下子shell。
1.1 子shell的继承特性
子shell从其父shell继承了一些重要特性,具体如下:
- 当前目录
- 环境变量
- 标准输入、输出和错误信息,以及其他打开的文件描述符
- 环境文件中定义的任何特性
- 被忽略的信号
其中,前三个特性是所有子进程都会继承的,而最后一个特性则是子shell所独有的。同样重要的是,子shell也有一些不会从父shell继承的特性:
- 除环境变量和环境文件中定义的变量之外的shell变量
- 未被忽略的信号处理方式
这些内容之前有过提及,但由于它们容易让人混淆,所以值得再次强调。
1.2 嵌套子shell
子shell并不一定需要存在于单独的脚本中,你也可以在与父脚本(或函数)相同的脚本中启动一个子shell。这与上一章提到的代码块非常相似,只需用括号(而不是花括号)将一些shell代码括起来,这些代码就会在子shell中运行,我们称之为嵌套子shell。
例如,下面是一个计算器程序,使用子shell而非代码块:
( while rea