【问题标题】:Environment variable with spaces in a string - How to use them from /proc/pid/environ字符串中带有空格的环境变量 - 如何在 /proc/pid/environ 中使用它们
【发布时间】:2015-06-06 02:09:50
【问题描述】:

我将字符串中带有空格的变量设置为新的 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

【问题讨论】:

  • 您确定需要这样做吗?从进程启动的进程继承调用进程的环境。
  • 查看链接 github 问题以了解为什么会提出这个问题。最终目标是在 Docker 容器中启动一个 shell,该容器具有与容器中的 PID 1 相同的环境变量。

标签: linux bash environment-variables nsenter


【解决方案1】:

只需将-L1 添加到xargs (每个命令行的最大非空白输入行数):

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

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

strings /proc/self/environ

【讨论】:

    【解决方案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 指定进程。

    【讨论】:

    • 非常感谢您花时间在这方面,但是添加这么大的依赖项(python)来做一些看起来很容易的事情有点难过。我想我会使用 sed 或 awk 来做同样的事情。
    • 所以,用 C 写或者去编译它。我敢打赌 sed 和 awk 也会有问题,尤其是在处理包含引号等的可变内容时。
    猜你喜欢
    • 2011-04-03
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2013-03-10
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    相关资源
    最近更新 更多