Linux 将所有环境变量传递给sudo';编辑稿

Linux 将所有环境变量传递给sudo';编辑稿,linux,bash,shell,sudo,Linux,Bash,Shell,Sudo,我有一个shell脚本使用sudo调用另一个shell脚本,例如: test1.sh: #! /bin/sh echo "In test1" UVAR=bar echo "UVAR=${UVAR}" sudo ./test2.sh echo "In test1 - after call to test2" echo "UVAR=${UVAR}" 和test2.sh: #! /bin/sh echo "In test2" whoami echo "UVAR=${UVAR}" UVAR=baz e

我有一个shell脚本使用sudo调用另一个shell脚本,例如: test1.sh:

#! /bin/sh
echo "In test1"
UVAR=bar
echo "UVAR=${UVAR}"
sudo ./test2.sh
echo "In test1 - after call to test2"
echo "UVAR=${UVAR}"
和test2.sh:

#! /bin/sh
echo "In test2"
whoami
echo "UVAR=${UVAR}"
UVAR=baz
echo "UVAR=${UVAR}"
echo "leaving test2"
我可以通过将
UVAR=$UVAR
放在调用
sudo
之前,使
test1.sh
中的单个变量(例如
UVAR
)在
test2.sh
中可用,但如果我希望它适用于所有变量呢?在调用
test2.sh
时显式命名所有变量变得不切实际(特别是因为我无法直接控制实际中可能存在哪些变量)。如果我没有使用
sudo
调用
test2.sh
(这是实际问题中需要的),我可以直接使用source
test2.sh

一个额外的好处是允许我保护
test1.sh
不受
test2.sh
中变量更改的影响,即在示例中,在
test1.sh
中输出
UVAR
的第二行应该给出与第一行相同的结果


(我用BASH标记这一点,因为脚本现在使用BASH,但是如果它可以用其他shell解决,我会感兴趣的,如果只需要对脚本进行微小的更改,可以考虑用其他东西替换BASH)。

/bin/sh
通常不是
bash
。您必须导出
UVAR
等,您需要使用
-E
sudo
来保护环境,
sudo
必须配置为允许您保护环境。@Cyrus:对,这可能有点令人困惑,因为我在编写示例脚本时没有考虑到这一点。真正的第一个脚本实际上有
#/bin/bash
,可能的第二个脚本使用
#/bin/bash
#/bin/sh
这实际上是机器上的破折号,无论是否应该运行。我认为这不会改变任何事情,但很抱歉造成混乱。@chepner:实际上,
sudo
是通过
-E
调用的(我猜,之前负责服务器的人已经设置好了),配置为允许这样做。但是必须导出变量与必须明确提及变量差不多(即不需要)。有三种方法可以将值传递给另一个进程:作为命令行参数、通过环境或显式读取文件。请选择。