Добавление значений к существующим значениям переменных среды в go

Как я могу добавить другое значение к существующему значению переменной среды идти?

Если CGO_CXXFLAGS имеет значение "-Я/бла/бла"

Поскольку следующее не работает

$ go env -w CGO_CXXFLAGS = "$CGO_CXXFLAGS -I/foo/bar"

Я хочу найти правильный способ, чтобы CGO_CXXFLAGS имел значение "-я/бла/бла -я/фу/бар"

избегая простой переустановки всех значений плюс новое, например:

$ go env -w CGO_CXXFLAGS = "-I/blah/blah -I/foo/bar"

go env -w CGO_CXXFLAGS = "$CGO_CXXFLAGS -I/foo/bar"

Volker 07.05.2022 08:17

Нет. это не работает. если бы это было так просто, я бы не спрашивал.

marc wellman 07.05.2022 08:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку go env <var_name>выводит действующую настройку переменной (т. е. не обязательно значение по умолчанию), надежный способ получить текущее значение по умолчанию для переменной среды — использовать подоболочка (при условии, что используется оболочка Bash):

$ (unset <var_name>; go env <var_name>)

И затем, чтобы установить новое значение, которое вы хотите использовать подстановка команды:

$ go env -w <var_name> = "$(unset <var_name>; go env <var_name>)<value_to_append>"

См. следующий аннотированный журнал для рабочего примера:

# Write an initial default.
$ go env -w CGO_CXXFLAGS=-I/blah/blah

$ go env CGO_CXXFLAGS
-I/blah/blah

# Keep in mind that the default can be overridden by a currently set 
# environment variable.
$ export CGO_CXXFLAGS = "-I/override/default"

$ go env CGO_CXXFLAGS
-I/override/default

# To print the default value even when it is being overridden,
# in a subshell, unset the environment variable and then run 'go env'. 
$ (unset CGO_CXXFLAGS; go env CGO_CXXFLAGS)
-I/blah/blah

# To set a new default value utilizing the existing default value.
#
# Note: if the default isn't being overridden, no warning will be printed.
$ go env -w CGO_CXXFLAGS = "$(unset CGO_CXXFLAGS; go env CGO_CXXFLAGS) -I/foo/bar"
warning: go env -w CGO_CXXFLAGS=... does not override conflicting OS environment variable

# State after change...
# Default value
$ (unset CGO_CXXFLAGS; go env CGO_CXXFLAGS)
-I/blah/blah -I/foo/bar

# Overridden value
$ go env CGO_CXXFLAGS
-I/override/default

В качестве альтернативы вы можете найти файл со значениями по умолчанию и проанализировать его напрямую (go env GOENV сообщит вам местоположение файла), но я думаю, что проще временно отключить переменную среды и позволить go env выполнить работу.


Эквивалент в PowerShell:

# Write default.
PS > go env -w CGO_CXXFLAGS=-I/blah/blah
PS > go env CGO_CXXFLAGS
-I/blah/blah

# Override default.
PS > $Env:CGO_CXXFLAGS = "-I/override/default"
PS > go env CGO_CXXFLAGS
-I/override/default

# Print default.
PS > Start-Job {$Env:CGO_CXXFLAGS=''; go env CGO_CXXFLAGS} | Receive-Job -Wait
-I/blah/blah

# Append to default.
PS > go env -w CGO_CXXFLAGS = "$(Start-Job {$Env:CGO_CXXFLAGS=''; go env CGO_CXXFLAGS} | Receive-Job -Wait) -I/foo/bar"
warning: go env -w CGO_CXXFLAGS=... does not override conflicting OS environment variable

# Final state.
PS > go env CGO_CXXFLAGS
-I/override/default

PS > Start-Job {$Env:CGO_CXXFLAGS=''; go env CGO_CXXFLAGS} | Receive-Job -Wait
-I/blah/blah -I/foo/bar

Это работает - отличная работа! Поскольку я работаю под Windows 10, мне нужно было использовать cygwin, чтобы попробовать его, потому что ни cmd promt, ни Power Shell в Windows не могут создавать вспомогательные оболочки, как вы это описали. И я впечатлен тем, сколько усилий требуется, чтобы просто выполнить такую ​​тривиальную задачу, как добавление значения к переменной env. Я подожду еще немного, прежде чем принять ответ, может быть, у кого-то есть идея, как это сделать с оболочкой Windows. Тем не менее, большое спасибо за этот отличный ответ!

marc wellman 07.05.2022 09:59

Чтобы было ясно, то, что вы пытаетесь сделать, это не просто «добавление значения к переменной env» (что было бы просто export VAR = "${VAR} appended value" в Bash). На самом деле вы изменяете файл, поддерживаемый инструментом go env. И приведенное выше подробно описывает решение, работающее в рамках ограничений функциональности инструментов.

chuckx 07.05.2022 11:06

Хорошо, вы полностью убедили меня! Большое спасибо!

marc wellman 07.05.2022 11:16

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