正在使用的脚本:parent.ksh、child.ksh、functions.ksh
当父源函数为.ksh时,则执行/child.ksh,源文件中的函数对child.ksh不可用。这总是真的吗?或者这与child.ksh的执行方式有关吗?Child.ksh可以作为文件的来源,但我正在努力理解为什么它不能像当前配置的那样工作,以及如何改变这种行为。
读一点关于子shell的知识,让你调用不同的东西会影响它们的行为,但我不清楚我走的是正确的道路。
在gitbash-下在我的笔记本电脑上测试
$: 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
因此,根据您的系统,您需要显式导出相关的函数名。
某些解析器可能不支持此功能。祝你好运
这总是真的吗
函数不能导出,也不能由子进程执行环境继承。变量是";本地";默认情况下,可以标记为使用CCD_ 1导出。函数根本无法导出——除了Bash-shell有一个扩展,可以使用export -f
导出函数,这是Bash特有的。
POSIX中的参考:https://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_12。简而言之,潜艇!=子进程。
,或者这与child.sh的执行方式有关?
这并不重要——如果执行了它,就会创建一个不包括函数的流程环境。
就像其他答案中所说的那样,脚本源文件,然后由shell执行该源文件中定义的代码。
当脚本执行另一个程序(无论是脚本还是任何其他程序(时,它在单独的进程中执行,并且不会从父shell的内部上下文继承任何内容。
父shell在执行新进程之前设置的环境变量(在代码中的任何位置(例如源文件((由新进程继承。
有一种方法(如果知道它在做什么,可能会很好(是在( ... )
中创建子shell,并在那里获取child.sh
,
类似:
fn () { echo 'i am fn()'; }
(
. ./child.sh
)
现在,如果./child.sh
执行函数fn
,则消息i am fn()
应出现在stdout中。
编辑(2021-07-11(:从(…(部分末尾删除了exit
(有人注意到吗?(。shell(与在Unix中分叉子进程的C/Perl代码不同(在没有明确给定&
的情况下等待并重新获取子进程,以使它们并行运行。