【问题标题】:Sub-shell process not be able to access variables and functions defined in parent shell子shell进程无法访问父shell中定义的变量和函数
【发布时间】:2019-02-07 19:58:59
【问题描述】:

我在同一个目录下有 3 个脚本,请在下面找到 x.sh、y.sh 和 z.sh 的内容:-

x.sh :-

xData="DataOfX"

function xInit(){
    echo "xInit : data of a >$xData<"
}

y.sh :-

. x.sh

xInit

sh z.sh zInit

z.sh :-

function zInit(){
    echo "zInit of z"
    xInit
}

$@

执行中

。 y.sh

在同一目录中给出以下输出:-

xInit : data of a >DataOfX<
zInit of z
z.sh: line 3: xInit: command not found

子shell进程如何访问父shell初始化的变量和函数?

【问题讨论】:

  • 使用 export 导出变量。

标签: bash function shell variables subshell


【解决方案1】:

“子shell”这个词是有问题的,甚至man bash在使用方式上也不一致。严格来说,子外壳是另一个外壳环境,它继承了父外壳的所有功能,包括所有变量。

括号给出了一个子shell。变量BASH_SUBSHELL 给出了子shell 的级别$$ 给出了shell 的PID(在子shell 中它被伪装成父shell 的PID)。

$ x=42

$ echo $BASH_SUBSHELL, $x, $$
0, 42, 1130
$ (echo $BASH_SUBSHELL, $x, $$)
1, 42, 1130
$ ( (echo $BASH_SUBSHELL, $x, $$) )
2, 42, 1130

当你执行一个脚本时,那不是一个子shell。获取脚本gash.sh

echo $BASH_SUBSHELL, $x, $$

运行方式:

$ ./gash.sh
0, , 8419

注意空白,因为x 未被复制。不是子shell,PID也不一样。甚至

$ (./gash.sh)
1, , 8421

这是一个运行子进程的子shell,所以也不起作用。

你需要将变量移动到环境块,复制到子进程中,使用export:

$ export x
$ ./gash.sh
0, 42, 8423

未导出的变量仅在使用( ) 的子shell 中可用,在其他子进程中不可用。对于函数,请使用export -f

【讨论】:

    【解决方案2】:

    添加 export 应该可以完成工作:

    export xData="DataOfX"
    

    https://www.tutorialspoint.com/unix_commands/export.htm

    export- 命令是 bash shell BUILTINS 命令之一,它 意味着它是你外壳的一部分。导出命令相当简单 使用,因为它具有简单的语法,只有三个可用的命令 选项。一般来说,export命令会标记一个环境变量 与任何新分叉的子进程一起导出,因此它 允许子进程继承所有标记的变量。

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2011-06-23
      • 2016-11-08
      • 1970-01-01
      • 2011-10-21
      • 2019-08-15
      • 1970-01-01
      • 2021-01-25
      • 2018-03-23
      相关资源
      最近更新 更多