深入探索 UNIX 中的子shell与环境变量
在 UNIX 系统中,理解进程创建、变量和环境的工作原理对于编写高效且可移植的 shell 脚本至关重要。下面将详细介绍这些方面的知识。
1. 进程创建
在 UNIX 系统里,没有直接用于将新程序作为子进程启动的系统调用。 fork()
系统调用并非启动新程序,而是复制一个正在运行的进程; exec()
系统调用(实际上是一组相关的系统调用)可以用指定的程序替换当前进程。所以,要生成新进程,需先使用 fork()
,然后在子进程中使用 exec()
启动新命令。C 库中有一个包装函数 system()
,可将命令作为子进程运行,在 UNIX 系统中,该函数通过将提供的命令传递给 shell 来工作。
在 shell 脚本中,无法显式地使用 fork()
,而是通过运行命令、创建管道或运行子 shell 来实现类似功能。shell 提供了基于 fork()
和 exec()
的常见任务,而非直接访问这些系统调用。
有些进程可能有多个同时执行的路径,即线程。不过,UNIX shell 不使用线程,shell 启动的每个进程都是完全独立的。在可移植的 shell 脚本中,通常无需考虑线程。但如果使用 ps
命令的输出,要注意线程是否会显示在 ps
的输出中,因为这可能会导致单个进程 ID 有多行输出。
线