我在 Stack Overflow 上看到了很多答案和评论
提到做一些事情来避免子shell。在一些
情况下,给出了一个功能性原因
(最常见的是,可能需要读取变量
在其内部分配的子 shell 之外),但是在
在其他情况下,回避似乎被视为结束
在自身。例如
tsv 文件的两列的并集 https://stackoverflow.com/q/19020255/#19022363
建议{ ... ; } | ...
而不是( ... ) | ...
,所以无论如何都有一个子 shell。
使用 sed 和 mv 命令取消隐藏 unix 中的隐藏文件 https://stackoverflow.com/q/20059064/#20063013
Linux bash 脚本复制文件 https://stackoverflow.com/q/7945656/#comment29349903_7945712
明确指出,
“目标只是避免子外壳”
为什么是这样?是为了风格/优雅/美丽吗?为了
性能(避免分叉)?为了防止可能
错误?还有别的事吗?
有一些事情正在发生。
首先,分叉子 shell 只发生一次时可能不易察觉,但如果您在循环中执行此操作,则会对性能产生可衡量的影响。在 Windows 等平台上,性能影响也更大,因为在 Windows 上,分叉不像现代 Unix 那样便宜。
其次,分叉一个子 shell 意味着您拥有多个上下文,并且在它们之间切换时信息会丢失 - 如果您更改代码以在子 shell 中设置变量,那么当子 shell 退出时该变量就会丢失。因此,您的代码中包含的子 shell 越多,您在以后修改它时就必须越小心,以确保您所做的任何状态更改实际上都会持续存在。
See Bash常见问题解答#24 http://mywiki.wooledge.org/BashFAQ/024有关子 shell 引起的令人惊讶的行为的一些示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)