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