我有一个程序可以进行大量的环境操作。它设置 PYTHONPATH 和 LD_LIBRARY_PATH 之类的东西。
该程序需要运行另一个程序,但在一个新的环境中,没有所有的环境操作,但使用 rc 文件中的基本环境。
我想我可以用 csh -c 来做到这一点,但这会保留当前的环境。有没有好的方法可以做到这一点?
我为此使用什么 shell 并不重要。另请注意,我需要原始 .rc 文件,因此 env -i 不太适合我。 (我想我可以用 env 和 bash -cl 一起破解一些东西,但应该有一个更好的方法)
答案1
分叉新进程将保护环境。
如果您需要在给定环境中运行某个进程,则该进程启动的所有进程也将使用该环境。
但是,您可以将未污染的环境保存到文件中:export >original_env
.
稍后您可以使用该文件清除污染的环境env -i
并导入旧环境。
答案2
我不确定这是否是最佳的,但我已经在小型测试中得到了以下内容:
env -i /bin/bash -cl 'COMMAND'
显然,您不能使用 -cl 运行 csh,因为 -l 不能与任何其他参数共存......但在 bash 中可以。
预计到达时间:
我想这就是我实际使用的:
#!/bin/csh -f
set evs = ""
if ($1 == '--envVars') then
set envs = "$2"
shift
shift
endif
env -i $envs CMD="$*" /bin/bash -c '$CMD'
如果需要的话,它可以让我从命令行输入 ENV 变量,例如 $PATH 和 $PYTHONPATH...
答案3
我能想到的最简单的方法就是不要使用export
变量。根据您的使用场景,这可能可行,也可能不可行。例如:
$ cat a.sh
#!/bin/bash
BAR=foo
export BAZ=foo
bash -c 'echo "bash -c : BAR: $BAR, BAZ: $BAZ"'
echo "normal : BAR: $BAR, BAZ: $BAZ"
$ ./a.sh
bash -c : BAR: , BAZ: foo
normal : BAR: foo, BAZ: foo
正如您在上面的示例中所看到的,由 ; 启动的 shellbash -c
只能访问导出的变量。
答案4
我发现的唯一方法是使用 sudo(如果允许的话):
sudo -u "$USER" path_to_script
示例脚本:
#!/bin/sh
set | grep ARGH
用法:
$ export ARGH=yes
$ sudo -u "$USER" ./check_env
(empty line, so ARGH is not set)