自动导出 shell/bash 函数

自动导出 shell/bash 函数

我有一个像这样声明的 bash 函数:

function foo {
  echo "this is foo";
}

我没有调用export -f foo,但它仍然可以在子 shell 中使用。

但是,通常当我声明这样的函数时:

foo(){
  echo "this is foo";
}

然后我必须打电话:

export -f foo;

我是在想象吗,不同的声明语法中的导出行为是否存在差异?

请注意,据我所知,我不需要导出函数:

. my_script_with_foo_in_it.sh  # this is in ~/.bash_profile/.bashrc

然后我可以在 bash shell 中调用:

foo

没有任何问题,即使不导出该函数。

答案1

source当使用或获取脚本时.,脚本的内容将在当前 shell 的环境中执行。源脚本中定义的任何函数以及任何 shell 变量(无需导出)都将在源脚本后在当前 shell 中可用。这是目的寻找脚本。

例如,这就是/etc/profile/etc/bash.bashrc文件如何为交互式/登录 shell 设置基本环境的方式。

此外,某些命令是在与 shell 环境重复的子 shell 环境中执行的。在这样的环境中,shell 变量和函数是可用的。另请参阅 POSIX 标准Shell执行环境(我的重点):

子shell环境应创建为副本shell 环境的不同之处在于,未被忽略的信号陷阱应设置为默认操作。对子 shell 环境所做的更改不应影响 shell 环境。命令替换、用括号分组的命令以及异步列表应在子 shell 环境中执行。此外,多命令管道中的每个命令都位于子shell环境中;然而,作为扩展,管道中的任何或所有命令都可以在当前环境中执行。所有其他命令应在当前 shell 环境中执行。

请注意,子 shell 与子进程不同。

仅在创建环境变量时才需要导出变量。环境变量由任何子进程继承。


另请注意,有一个目录调用~/.bash_profile有点令人困惑,因为bashshell 会尝试获取常规文件 ~/.bash_profile启动登录 shell 时。如果您想将 shell 初始化文件移到其他地方,我建议您将目录重命名为类似或~/.bash_profile的名称。如果您希望自动获取这些文件,则仍然需要从和调用它们。~/.shell~/.shell_startup~/.bash_profile~/.bashrc

相关内容