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 代码不同)在未明确给出 &
让它们 运行 并行时等待并获取子进程。
正在使用的脚本: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 代码不同)在未明确给出 &
让它们 运行 并行时等待并获取子进程。