2

我将字符串中带有空格的变量设置为新的 bash:

VAR='my variable with spaces' /bin/bash

现在,如果我想在相同的环境中启动一个新的 bash,我会执行以下操作:

ENV=$(cat /proc/self/environ | xargs -0 | grep =)
env -i - $ENV /bin/bash

但问题是,在 中/proc/self/environ,这个变量没有引号。所以最后一个命令抛出一个:env: variable: No such file or directory

我该如何解决这个限制?

PS:这是以下问题的简化版本:https ://github.com/jpetazzo/nsenter/issues/62

4

2 回答 2

2

我认为这里的答案是不使用 shell 脚本进行设置。使用更高级的语言可以更容易地解析/proc/<PID>/environ成有用的东西。这是一个简短的示例:

#!/usr/bin/python

import os
import sys
import argparse


def parse_args():
    p = argparse.ArgumentParser()
    p.add_argument('pid')
    p.add_argument('command', nargs=argparse.REMAINDER)
    return p.parse_args()


def main():
    args = parse_args()

    env = {}
    with open('/proc/%s/environ' % args.pid) as fd:
        for envspec in fd.read().split('\000'):
            if not envspec:
                continue

            varname, varval = envspec.split('=', 1)
            env[varname] = varval

    print env
    os.execvpe(args.command[0], args.command, env)


if __name__ == '__main__':
    main()

将它放在一个名为 的文件中env-from,使其可执行,然后您可以运行:

env-from <pid> bash

您将使用来自指定进程的环境变量获得一个 shell。

于 2015-04-01T13:44:41.813 回答
0

只需添加-L1xargs(每个命令行的最大非空白输入行):

xargs -0 -L1 -a /proc/self/environ

这将使您在单独的行上为您提供每个变量,从而更容易处理。或者干脆使用

strings /proc/self/environ
于 2021-09-21T20:56:29.390 回答