linux - 如何将 shell 脚本变量导出到子脚本?

标签 linux bash shell debian

<分区>

我有一个非常简化的 bash 脚本,它会 self 调用,但无法将导出的变量 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 在子脚本中未绑定(bind)。

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

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

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

我想我遗漏了一些明显的东西,因为我对 shell 脚本编写经验还很缺乏。

谢谢。

最佳答案

出于安全原因,您不能将环境变量“注入(inject)”到 sudo session 中。您可以检查您的系统是否支持以下 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.

否则,如果您只是通过命令行参数传递变量,您将使自己的生活变得很多

关于linux - 如何将 shell 脚本变量导出到子脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47799553/

相关文章:

c++ - 在关闭文件时获取段错误

linux - memcpy memmove GLIBC_2.14/2.2.5的解释

android - Android 与其他 Linux 有何不同?

python - 从特定目录中的 python 脚本运行 bash 命令

java - 在 shell 中执行 java 并等待我得到返回码

使用 fork 创建多个进程

regex - sed:替代模式中未转义的换行符?

bash - 如何在whiptail中循环case语句

linux - 使用 printf 以特殊格式打印值

shell - 在 Shell 脚本中抑制进度条