exec.Command () в Go с переменной окружения - PullRequest
0 голосов
/ 25 июня 2018

Я хотел бы запустить следующий код в Go:

out, err := exec.Command("echo", "$PATH").Output()

Результат был:

$PATH

Вместо ожидаемого значения «PATH = / bin ...».

Почему? И как я могу получить ожидаемое значение?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Ваша команда не интерпретируется оболочкой, поэтому ожидаемая замена переменных не выполняется.

Из документации пакета exec :

... пакет os / exec намеренно не вызывает системную оболочку и не раскрывает никаких шаблонов глобусов и не обрабатывает другие расширения, конвейеры или перенаправления, обычно выполняемые оболочками.

...

Чтобы развернуть переменные среды, используйте ExpandEnv пакета os.

Таким образом, для достижения желаемого результата в вашем примере:

out, err := exec.Command("echo", os.ExpandEnv("$PATH")).Output()

Стоит рассмотреть набор функций для получения переменных среды и использования того, что лучше всего подходит для вашего конкретного случая использования:

  • func ExpandEnv(s string) string -ExpandEnv заменяет $ {var} или $ var в строке в соответствии со значениями текущих переменных среды.Ссылки на неопределенные переменные заменяются пустой строкой.
  • func Getenv(key string) string - Getenv извлекает значение переменной среды, названной ключом.Возвращает значение, которое будет пустым, если переменная отсутствует.Чтобы различать пустое значение и неустановленное значение, используйте LookupEnv.
  • func LookupEnv(key string) (string, bool) - LookupEnv извлекает значение переменной среды, названной ключом.Если переменная присутствует в среде, возвращается значение (которое может быть пустым), а логическое значение равно true.В противном случае возвращаемое значение будет пустым, а логическое значение будет ложным.
0 голосов
/ 25 июня 2018

С Пример: переменные среды , вы можете попробовать (вместо системной команды echo) использовать os.Getenv:

fmt.Println("PATH:", os.Getenv("PATH"))
...