由()启动的子shell读取启动文件吗?

时间:2014-11-01 12:27:28

标签: bash shell zsh

在shell中使用括号对命令进行分组,在子shell中执行它们,这样它们就不会影响父shell环境。

现在,我想知道这个衍生的子shell是否像任何其他shell一样读取init文件。 根据直接经验,我会说他们没有。 但我找不到任何地方。

另外,对于不同类型的贝壳,这是不同的吗?

2 个答案:

答案 0 :(得分:2)

一般来说,shell的行为并没有特别明确,因为only applicable standard基本上是对各种常用shell的行为进行逆向工程的结果。尽管如此,人们仍然期望贝壳会收敛到标准,尽管有扩展。

话虽如此,这就是Posix所说的(...)

  

(compound-list)
  在子shell环境中执行复合列表。

subshell environment

  

子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和重定向之外的所有内容,因此它必须再次读取配置文件。