【发布时间】:2019-12-10 02:28:13
【问题描述】:
我有一些正在设置的环境变量,并试图通过子进程的子进程访问它们。我正在尝试使用 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"
是否有更优雅的解决方案将环境变量传递给嵌套子级?
在我的实际实现代码中,它不是我尝试使用的 shell 脚本,而是启动另一个依赖于环境变量的进程,因此获取脚本是不可行的。
【问题讨论】:
-
很好的问题。我的理解是,只要它是从同一用户的进程运行的,环境就会被继承。
-
所以可能会发生一些事情。根据您的系统,“sh”可能意味着实际的 /bin/sh 或 bash 的符号链接。此外,a.sh 上的 shebang 可能指向与父 shell 不同的 shell。 IIRC,导出一个变量对于有多少孩子会看到它几乎没有限制,因此问题似乎与这些问题有关,而不是孩子外壳无法使用该变量
-
我刚刚更新了示例以包含 shebangs。
-
这里的问题是
sudo特有的,出于安全原因,它不会将继承的环境变量传递给它运行的进程。 (如果您使用-E选项,它会这样做,但前提是sudo配置为允许给定用户或命令使用该选项。)
标签: linux bash shell environment-variables sh