【问题标题】:how to export shell script variable to a child script? [duplicate]如何将shell脚本变量导出到子脚本? [复制]
【发布时间】:2018-05-27 17:28:48
【问题描述】:

我有这个非常简化的 bash 脚本,它会调用自己并且无法将导出的变量 id 保留到子脚本:

  1 #! /bin/bash
  2 
  3 SCRIPT="$(realpath "${0}")"
  4 
  5 echo "start script"
  6 echo "euid= $EUID"
  7 
  8 if [ $EUID != 0 ]; then
  9 
 10         export id=$EUID
 11         sudo ${SCRIPT}
 12         exit 0
 13 fi
 14 
 15 echo "HERE WE ARE ROOT"
 16 echo "euid= $EUID"
 17 echo "id= $id"
 18 
 19 exit 0

输出是:

start script
euid= 1000
start script
euid= 0
HERE WE ARE ROOT
euid= 0
id= 

普通用户的EUID 是 1000,我要做的是将这个 EUID 保留在以 root 身份运行的子进程中。

id 在子脚本中未绑定。

所以我用交互式外壳做了一个简单的测试:

$ export var=1
$ /bin/bash
$ echo $var
1
$ var=2
$ echo $var
2
$ exit
$ echo $var
1

var在这里是正确导出的,但在其他情况下不是,有什么区别?

我想我缺少一些明显的东西,因为我在 shell 脚本方面非常缺乏经验。

谢谢。

【问题讨论】:

    标签: linux bash shell debian


    【解决方案1】:

    出于安全原因,您不能将环境变量“注入”到 sudo 会话中。您可以检查您的系统是否支持以下 sudo 标志:

     -E, --preserve-env
                 Indicates to the security policy that the user wishes to pre‐
                 serve their existing environment variables.  The security
                 policy may return an error if the user does not have permis‐
                 sion to preserve the environment.
    

    否则,如果你只是通过命令行参数传递变量,你会让你自己的生活更加轻松

    【讨论】:

    • 确实,这就是解释,我忘记了那些安全原因。谢谢。