首页 > 解决方案 > 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

解决方案


bash 手册页指出

要执行除内置函数或 shell 函数之外的简单命令时,将在由以下内容组成的单独执行环境中调用它。

...

  • 标记为导出的 shell 变量和函数,以及为命令导出的变量,在环境中传递

并且

命令替换、用括号分组的命令和异步命令在作为 shell 环境副本的子 shell 环境中调用,除了 shell 捕获的陷阱被重置为 shell 在调用时从其父 shell 继承的值。作为管道的一部分调用的内置命令也在子 shell 环境中执行。对子 shell 环境所做的更改不会影响 shell 的执行环境。

(强调我的)

只有最后一个命令bash -c x在单独的执行环境中执行。


推荐阅读