Как получить переменную среды команды после запуска - PullRequest
0 голосов
/ 08 марта 2020

Я запускаю простую команду через exec.Command в Go. Теперь я хочу знать, возможно ли получить все переменные среды этого процесса.

Причина. Я могу установить их, используя это:

cmd := exec.Command("bash ./script.sh")
cmd.Dir = filepath.Join(s.Path, "..")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Env = []string{"MY_VAR=some_value"}
err := cmd.Run()

Кто-нибудь знает, возможно ли это? И если это также будет работать для Windows / MacOS / Linux

1 Ответ

4 голосов
/ 08 марта 2020

Краткий ответ: Нет.

Я ненавижу говорить "это невозможно", потому что всегда есть некоторые способы сделать что-то подобное (например, прочитайте /proc/.../environ на Linux, сделайте несколько сложных ReadProcessMemory, потыкайте в Windows и т. д. c.). Но это не предназначено для этого, и для него также нет переносимого решения.

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

Если вам нужно передать информацию от вашего ребенка родителю, есть несколько способов сделать это:

  • Вы можете отправить данные на stdout и захватить их в родительском
  • Вы можете использовать трубу / сокет и передать соответствующий дескриптор в качестве параметра командной строки
  • Вы можете использовать shared память / файл с отображенной памятью
  • Вы можете использовать реальный файл в известном месте (не рекомендуется)
...