Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将环境变量传递给嵌套的子级_Linux_Bash_Shell_Environment Variables_Sh - Fatal编程技术网

Linux 将环境变量传递给嵌套的子级

Linux 将环境变量传递给嵌套的子级,linux,bash,shell,environment-variables,sh,Linux,Bash,Shell,Environment Variables,Sh,我有一些正在设置的环境变量,我试图通过子进程的子进程访问它们。我正在尝试使用shell启动另一个进程。在我的示例中,它只是另一个保持简单的shell脚本 我浏览了shell文档,并尝试使用-a标志,但没有成功。如果我显式地将env变量从父级复制到子级,它将起作用 a、 嘘 #/垃圾箱/垃圾箱 #这里不行 回声$FOO parent.sh #/垃圾箱/垃圾箱 导出FOO=bar sudo-H-u用户名nohup sh-c“echo$FOO#在这里工作;sh./a.sh” 但是,如果我显式地将F

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

我浏览了shell文档,并尝试使用
-a
标志,但没有成功。如果我显式地将env变量从父级复制到子级,它将起作用

a、 嘘

#/垃圾箱/垃圾箱
#这里不行
回声$FOO
parent.sh

#/垃圾箱/垃圾箱
导出FOO=bar
sudo-H-u用户名nohup sh-c“echo$FOO#在这里工作;sh./a.sh”
但是,如果我显式地将FOO传递给内联shell脚本,它将起作用

#/垃圾箱/垃圾箱
导出FOO=bar
sudo-H-u用户名nohup sh-c“echo$FOO;export FOO=$FOO;sh./a.sh”
是否有一种更优雅的解决方案可以将env变量传递给嵌套的子级


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

sudo
不会保留调用方的环境,除非使用
-E
选项,即使如此,
sudo
也必须配置为允许为给定用户或命令保留环境

您的第一个示例,
sudo-H-u username nohup sh-c“echo$FOO”在这里工作;sh./a.sh“
,与

但是由
sudo
启动的
sh
进程的环境中不会有
FOO
。 (
sudo-H-u username-E nohup sh-c“sh./a.sh”
可能会工作,但这取决于本地安全策略。
-E
是一个请求,而不是命令。)

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

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

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

由于sudo在启动新进程时默认不保留环境,您应该指示它显式保留某个变量:

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

好问题。我的理解是,只要它是从同一个用户的进程运行,环境就会被继承。根据您的系统,“sh”可能表示实际的/bin/sh或bash的符号链接。此外,a.sh上的shebang可能指向与父shell不同的shell。IIRC,导出一个变量实际上没有限制有多少子级可以看到它,因此问题似乎与这些变量有关,而不是子级无法使用的变量。shellI刚刚更新了示例以包括shebangs。这里的问题特定于
sudo
,由于安全原因,它不会将继承的环境变量传递给它运行的进程。(如果您使用
-E
选项,则会这样做,但仅当
sudo
配置为允许对给定的用户或命令使用该选项时才会这样做。)-E应该可以工作,但通常您不希望将所有环境传递给子进程(例如,传递路径/主环境变量可能会导致问题),因此VAR=value更准确,尽管这些仍然受本地安全策略的约束,并且可能不被允许。它也适用于VAR=value方法吗?“在命令行上传递的变量受安全策略插件施加的限制。”但是,我认为该策略可以允许显式列出变量,同时整体拒绝继承变量。在我看来,任何解决方法都超出了问题的范围,因为它们需要系统管理员的合作,以便在
sudoers
文件中提供必要的配置。
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