将环境变量传递给嵌套子代

时间:2019-08-01 13:16:27

标签: linux bash shell environment-variables sh

我正在设置一些环境变量,并且正在尝试通过子进程的子进程访问它们。我正在尝试使用Shell启动另一个进程。在我的示例中,它只是另一个使事情保持简单的shell脚本。

我仔细阅读了shell文档,并尝试使用-a标志,但这没有用。如果我将环境变量从父级显式复制到子级,它将起作用。

a.sh

#!/bin/sh
# does not work here

 echo $FOO

parent.sh

#!/bin/sh
export FOO=bar
sudo -H -u username nohup sh -c "echo $FOO #works here; sh ./a.sh"

但是如果我明确将FOO传递给嵌入式Shell脚本,它将起作用

#!/bin/sh

export FOO=bar
sudo -H -u username nohup sh -c "echo $FOO;export FOO=$FOO; sh ./a.sh"

是否存在将env变量传递给嵌套子代的更优雅的解决方案?

在我的实际实现代码中,它不是我要使用的shell脚本,而是启动了另一个依赖于env变量的进程,因此寻找脚本是不可行的。

2 个答案:

答案 0 :(得分:2)

由于sudo在启动新进程时默认情况下不保留环境,因此您应该指示它明确保留某个var:

sudo FOO=100 -H -u username nohup sh -c "sh ./a.sh"
nohup: ignoring input and appending output to ‘nohup.out’
cat nohup.out
100

答案 1 :(得分:1)

除非您使用sudo选项,否则

-E不会保留呼叫者的环境,即使如此,sudo也必须配置为 allow 要保留的环境给定用户或命令。

第一个示例sudo -H -u username nohup sh -c "echo $FOO #works here; sh ./a.sh"(在shell处理之后)等效于

sudo -H -u username nohup sh -c "echo bar; sh ./a.sh"

,但是由sh开始的sudo进程在其环境中将没有FOO。 (不过,sudo -H -u username -E nohup sh -c "sh ./a.sh" 可能可以工作,具体取决于本地安全策略。-E request 而不是命令。)

您的第二个示例在经过shell处理之后是

sudo -H -u username nohup sh -c "echo bar;export FOO=bar; sh ./a.sh"

这里,sh不是从调用FOO的shell继承sudo;相反,您正在运行一个自身环境中定义一个 new 变量FOO的shell进程,该变量a.sh然后继承。