Ваша команда не интерпретируется оболочкой, поэтому ожидаемая замена переменных не выполняется.
Из документации пакета 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.В противном случае возвращаемое значение будет пустым, а логическое значение будет ложным.