我正在设置一些环境变量,并且正在尝试通过子进程的子进程访问它们。我正在尝试使用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变量的进程,因此寻找脚本是不可行的。
答案 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
然后继承。