命令执行环境(COMMAND EXECUTION ENVIRONMENT)
shell 有 execution environment (执行环境) 的概念,由下列内容组成:
•
shell 启动时继承的打开的文件,例如在内建命令 exec 中使用重定向 修改的结果
•
当前工作目录,使用 cd,pushd 或者 popd 设置,或是由 shell 在启动时继承得到
•
文件创建模式掩码,使用 umask 设置或是从 shell 的父进程中继承得到
•
当前陷阱,用 trap 设置
•
shell 参数,使用变量赋值或者 set 设置,或者是从父进程的环境中继承得到
•
shell 函数,在执行中定义或者是从父进程的环境中继承得到
•
设为允许的选项,在执行时设置 (要么是默认允许的,要么是命令行给出的) 或者是 用 set 设置
•
用 shopt 设为允许的选项
•
用 alias 定义的 shell 别名
•
各种进程号,包含后台作业的进程号,$$ 的值,以及 $PPID 的值
当并非 shell 函数或内置命令的简单命令执行时,它在一个由下述内容组成的 单独的执行环境中启动。除非另外说明,值都是从 shell 中继承的。
•
shell 打开的文件,加上对命令使用重定向修改和添加的文件
•
当前工作目录
•
文件创建模式掩码
•
标记为导出 (export) 的 shell 变量,以及传递到环境中为这个命令导出的变量
•
shell 捕捉的陷阱被重置为从 shell 的父进程中继承的值,shell 忽略的陷阱 也被忽略
在单独的环境中启动的命令不能影响 shell 的执行环境。
命令替换和异步命令都在子 shell 环境中执行。子 shell 环境是原有 shell 环境的赋值,但 shell 捕捉的陷阱被重置为 shell 启动时从父进程中继承的值。 作为管道一部分来执行的内建命令也在一个子 shell 环境中执行。对子 shell 环境所作修改不能影响到原有 shell 的执行环境。
如果命令后面是 & 并且没有启用作业控制,命令的默认标准输入将是空文件 /dev/null。否则,被执行的命令从调用它的 shell 中继承被重定向修改的 文件描述符。