父源外部文件,子级无权访问其中的功能

  • 本文关键字:访问 功能 外部 文件 shell ksh
  • 更新时间 :
  • 英文 :


正在使用的脚本: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代码不同(在没有明确给定&的情况下等待并重新获取子进程,以使它们并行运行。

相关内容

  • 没有找到相关文章

最新更新