parent 源外部文件,child 无法访问其中的函数

parent sources external file, child doesn't have access to functions within

正在使用的脚本:parent.ksh、child.ksh、functions.ksh

当 parent 源 functions.ksh,然后执行 ./child.ksh 时,源文件中的函数对 child.ksh 不可用。这总是正确的,还是与执行 child.ksh 的方式有关? Child.ksh 可以获取该文件,但我试图了解为什么它不能像当前配置的那样工作,以及如何改变这种行为。

阅读一些关于 sub-shells 的内容,你是否调用了不同的东西来影响它们的行为方式,但我不清楚我是否走在正确的道路上。

Is this always true

函数无法导出,也不会被子进程执行环境继承。默认情况下,变量是“本地”的,可以用 export 标记为导出。函数根本无法导出 - 除了 Bash shell 有一个导出函数的扩展 export -f,这是 Bash.

非常特定的

POSIX 中的引用:https://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_12。简而言之,一个 subshell != child process.

, or does it matter in the way child.sh was executed?

没关系 - 如果执行,则会创建一个不包含函数的进程环境。

在 git bash -

下在我的笔记本电脑上进行测试
$: cat a
. c
foo from a
./b

$: cat b
foo from b

$: cat c
foo() { echo "$@"; }
foo from c

$: ./a
from c
from a
./b: line 1: foo: command not found

但是,如果我在 c:

中添加一行
$: cat c
foo() { echo "$@"; }
export -f foo        # export the function named foo
foo from c

$: ./a
from c
from a
from b

因此,根据您的系统,您需要显式导出相关函数名称。

一些解析器可能不支持这个。祝你好运。

就像在其他答案中所说的那样,一个脚本源一个文件,然后该源文件中定义的代码由 shell.

执行

当脚本执行另一个程序(无论是脚本还是任何其他程序)时,它在单独的进程中执行,并且不会从父进程的内部上下文继承任何内容 shell。

父进程 shell 在执行新进程之前设置的环境变量(在代码中的任何位置(例如来自源文件))由新进程继承。

有一种方法(如果知道它在做什么可能会很好)在 ( ... ) 中创建子 shell 并在那里获取 child.sh

喜欢:

fn () { echo 'i am fn()'; }

(
 . ./child.sh
)

现在如果 ./child.sh 执行函数 fn 消息 i am fn() 应该出现在标准输出中。

编辑 (2021-07-11):从 ( ... ) 部分的末尾删除 exit(有人注意到了吗?)。 shell(与在 Unix 中分叉子进程的 C/Perl 代码不同)在未明确给出 & 让它们 运行 并行时等待并获取子进程。