我已经看到很多关于Stack Overflow的答案和评论,提到做一些事情来避免子shell.在某些情况下,给出了一个功能上的原因(通常,可能需要读取在其中分配的子shell之外的变量),但在其他情况下,避免似乎本身就被视为目的.例如
tsv文件的两列联合
建议{ ... ; } | ...
而不是
( ... ) | ...
,所以有两种方式的子shell.
Linux bash脚本
明确地复制文件,"目标只是避免子shell"
为什么是这样?是为了风格/优雅/美丽?为了表现(避免分叉)?为了防止可能的错误?别的什么?
有一些事情正在发生.
首先,当它只发生一次时,分支子shell可能是不明显的,但如果你在一个循环中这样做,它会增加可衡量的性能影响.在Windows等平台上,性能影响也更大,因为分叉并不像现代Unixlikes那样便宜.
第二,分支子shell意味着你有多个上下文,并且在它们之间切换时会丢失信息 - 如果你改变代码以在子shell中设置变量,那么当子shell退出时该变量就会丢失.因此,您的代码中包含的内容越多,以后修改它时就越需要小心,以确保您所做的任何状态更改都会实际持续存在.
有关由子壳引起的令人惊讶的行为的一些示例,请参阅BashFAQ#24.