bash 函数是否在当前 shell 或子 shell 中运行?

bash 函数是否在当前 shell 或子 shell 中运行?

我有一个打开的终端,我调用了一个 bash 函数:

change_path

在哪里:

change_path(){
 export PATH="foobar:$PATH";
}

change_path始终在当前 shell 中运行并始终更改当前 shell 的 $PATH?到目前为止,在我的测试中,情况似乎如此,但很难确定。

答案1

是的,您调用的函数正在当前 shell 中运行。
假设该函数已在当前 shell 中导入(定义)。这可以通过获取一些文件(如 ~/.bashrc)或在当前 shell 中手动编写函数来完成。您可以通过执行以下命令来确认这个假设:

$ type -a change_path

如果打印函数定义,则该函数已在当前 shell 中定义,并且可以访问当前 shell 变量,可以修改其中的任何变量。

这并不意味着如果函数得到适当限制,函数将始终修改变量,例如使用(...)而不是{...}

$ change_path()(
    export PATH="foobar:$PATH";
)

但该函数实际上仍在当前 shell 中运行,只是它启动了一个子 shell(...)

要确认这一点,请阅读 bash 手册(重点是我的):

函数
一个 shell 函数,如上面 SHELL GRAMMAR 中所述定义,存储一系列命令以供以后执行。当 shell 函数的名称用作简单命令名称时,将执行与该函数名称关联的命令列表。函数在当前 shell 的上下文中执行;没有创建新进程来解释它们(与 shell 脚本的执行进行对比)。

相关内容