如何在新的 shell 中运行程序?

如何在新的 shell 中运行程序?

我有一个程序可以进行大量的环境操作。它设置 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)

相关内容