Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash shell函数是否导出到子流程?_Bash - Fatal编程技术网

Bash shell函数是否导出到子流程?

Bash shell函数是否导出到子流程?,bash,Bash,根据ManBash的说法,如果shell函数是通过使用export或declare-x显式导出的,那么它们只会导出到子流程。此外,括号和反勾号(包括$(…))也在子流程中运行。那么,为什么这样做有效呢 #!/bin/bash function x { echo x; } x (x) echo `x` echo $(x) bash -c x 我希望看到“x”后面有4个错误。事实上,我看到4个前男友,然后是一个错误。这是如何解释的?bash手

根据ManBash的说法,如果shell函数是通过使用export或declare-x显式导出的,那么它们只会导出到子流程。此外,括号和反勾号(包括$(…))也在子流程中运行。那么,为什么这样做有效呢

    #!/bin/bash
    function x { echo x; }
    x
    (x)
    echo `x`
    echo $(x)
    bash -c x

我希望看到“x”后面有4个错误。事实上,我看到4个前男友,然后是一个错误。这是如何解释的?

bash手册页说明

当要执行内置或shell函数以外的简单命令时,将在单独的执行中调用该命令 环境包括以下内容

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

在子shell中调用命令替换、用括号分组的命令和异步命令 与外壳环境重复的环境,外壳捕获的陷阱重置为 shell在调用时从其父级继承的值。作为一部分调用的内置命令 也在子shell环境中执行管道的。无法更改对子shell环境所做的更改 影响shell的执行环境

(强调矿山)


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

bash手册页声明

当要执行内置或shell函数以外的简单命令时,将在单独的执行中调用该命令 环境包括以下内容

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

在子shell中调用命令替换、用括号分组的命令和异步命令 与外壳环境重复的环境,外壳捕获的陷阱重置为 shell在调用时从其父级继承的值。作为一部分调用的内置命令 也在子shell环境中执行管道的。无法更改对子shell环境所做的更改 影响shell的执行环境

(强调矿山)


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

感谢axiac发布了手动链接。通常我会在手册页中找到我需要的,但这里有点更深。所以我学会了:

  • 有一种称为“shell环境”的东西,它用定义的函数(除其他外,如shell变量)扩展了通常的流程环境(环境变量、打开的文件等)

  • 命令替换,用括号分组的命令(和异步命令)继承整个shell环境的副本,陷阱除外

  • 该手册有点混乱,因为它还使用短语“执行环境”和“子shell环境”来指代与shell环境相同的东西,但它们似乎都指的是相同的概念


    谢谢大家

    感谢axiac发布手动链接。通常我会在手册页中找到我需要的,但这里有点更深。所以我学会了:

  • 有一种称为“shell环境”的东西,它用定义的函数(除其他外,如shell变量)扩展了通常的流程环境(环境变量、打开的文件等)

  • 命令替换,用括号分组的命令(和异步命令)继承整个shell环境的副本,陷阱除外

  • 该手册有点混乱,因为它还使用短语“执行环境”和“子shell环境”来指代与shell环境相同的东西,但它们似乎都指的是相同的概念


    谢谢大家

    内置或shell函数不会运行子进程,如果你没有像“bash-c'x'”这样强制执行,那么我希望“x”(一个shell函数)不会在子进程中运行,我希望接下来的3行(不是内置或shell函数)会在子进程中运行。但是他们没有!这就是问题(回答如下)。这在中进行了解释。如果不强制执行类似“bash-c'x'”的命令,则内置或外壳函数不会运行子进程,因此我希望“x”(外壳函数)不会在子进程中运行,我希望接下来的3行(不是内置或外壳函数)会在子进程中运行。但是他们没有!这就是问题所在(回答如下)。这仍然令人困惑,因为我不清楚什么是shell环境或子shell环境,或者它们与执行环境的关系。看看手册,就像我在下面总结的一样,它们看起来都是一样的。此外,在本例中,您还删除了定义的相关部分,即在执行过程中定义的shell函数或在环境Cheers中从shell的父级继承的shell函数!这仍然令人困惑,因为我不清楚什么是shell环境或子shell环境,或者它们与执行环境的关系。看看手册,就像我在下面总结的一样,它们看起来都是一样的。此外,在本例中,您还删除了定义的相关部分,即在执行过程中定义的shell函数或在环境Cheers中从shell的父级继承的shell函数!