Переменная окружения с пробелами в строке - Как их использовать из /proc/pid/environment

Я установил переменную с пробелами в строке для нового 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

2 ответа

Я думаю, что ответ здесь заключается в том, чтобы не использовать сценарий оболочки для настройки. Использование языка более высокого уровня упрощает анализ /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

И вы получите оболочку, используя переменные окружения из указанного процесса.

Просто добавь -L1 к xargs (максимальное количество непустых строк ввода на командную строку):

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

Это даст вам каждую переменную в отдельной строке, что упростит обработку.

Другие вопросы по тегам