bash - shell 函数是否导出到子进程?
问题描述
根据 man bash,shell 函数只有在使用 export 或 declare -x 显式导出时才会导出到子进程。此外,括号和反引号(包括 $(...))在子进程中运行。那么为什么这行得通呢?
#!/bin/bash
function x { echo x; }
x
(x)
echo `x`
echo $(x)
bash -c x
我希望看到“x”后跟 4 个错误。事实上,我看到了 4 个 exe,然后是一个错误。这是如何解释的?
解决方案
bash 手册页指出
当要执行除内置函数或 shell 函数之外的简单命令时,将在由以下内容组成的单独执行环境中调用它。
...
- 标记为导出的 shell 变量和函数,以及为命令导出的变量,在环境中传递
并且
命令替换、用括号分组的命令和异步命令在作为 shell 环境副本的子 shell 环境中调用,除了 shell 捕获的陷阱被重置为 shell 在调用时从其父 shell 继承的值。作为管道的一部分调用的内置命令也在子 shell 环境中执行。对子 shell 环境所做的更改不会影响 shell 的执行环境。
(强调我的)
只有最后一个命令bash -c x
在单独的执行环境中执行。
推荐阅读
- ionic4 - 为 Android 构建 Ionic 产品
- vba - 尝试运行函数时会提示选择宏
- python - 将结果转换为对象数组 - Python
- hyperion - Hyperion Essbase 脚本方法
- hibernate - Spring数据REST PreInsertEventListener没有触发?
- python-3.x - 如何在同一个脚本中使用多个 asyncio websocket?
- python - 如何并排比较两个交互式散景地图?
- python - 如何解决重启tensorflow训练过程时f1值下降的问题?
- git - 更改库后颤振提交到 git
- javascript - 根据对象中的事件获取时间戳并将其推送到数组中?