在shell中使用括号对命令进行分组,在子shell中执行它们,这样它们就不会影响父shell环境。
现在,我想知道这个衍生的子shell是否像任何其他shell一样读取init文件。 根据直接经验,我会说他们没有。 但我找不到任何地方。
另外,对于不同类型的贝壳,这是不同的吗?
答案 0 :(得分:2)
一般来说,shell的行为并没有特别明确,因为only applicable standard基本上是对各种常用shell的行为进行逆向工程的结果。尽管如此,人们仍然期望贝壳会收敛到标准,尽管有扩展。
话虽如此,这就是Posix所说的(...)
:
(compound-list)
在子shell环境中执行复合列表。
子shell环境应创建为shell环境的副本,但未被忽略的信号陷阱应设置为默认操作。对子shell环境所做的更改不会影响shell环境。命令替换,与括号分组的命令和异步列表应在子shell环境中执行。另外,多命令管道的每个命令都在子shell环境中;但是,作为扩展,管道中的任何或所有命令都可以在当前环境中执行。所有其他命令都应在当前shell环境中执行。
这里的内容是子shell环境是“shell环境的副本”,而不是新的shell;唯一的区别是信号陷阱的特定例外。因此很明显,预计子shell将进行重新初始化,例如重新读取启动文件。
Posix仅为启动文件提供了一项要求,详见sh
utility的说明中的第4节:
ENV
当且仅当调用交互式shell时,此变量应由shell进行参数扩展,并且结果值应用作包含要在当前环境中执行的shell命令的文件的路径名。 / p>
大多数shell实现了一组更丰富的具有特定名称的启动文件,因此ENV
变量可能不是必需的。因此,Posix声明“仅在调用交互式shell时 ”这一事实仅仅是指示性的,但我认为这是一个很好的指示。
答案 1 :(得分:1)
当子shell启动时,它只是一个由fork()
生成的子节点,因此它从父节点继承所有子节点,并且不需要读取已经知道的配置文件。
相反,当shell为exec()
时,它会丢失除PID和重定向之外的所有内容,因此它必须再次读取配置文件。