2014-07-24 2 views
-1
이동

에 나는 Go OS마지막으로 환경 변수를 설정하는 방법은 무엇입니까?

err := os.Setenv("DBHOST", dbHostLocal) 
    if err != nil { 
     log.Fatalf("err %v", err) 
    } 

변수가 이동 프로그램을 사용할 수 있습니다 보인다 사용하여 내 컴퓨터에 몇 가지 환경 변수를 설정하려고하지거야하지만 난 꽤/이동 프로세스를 종료되면 변수는 더 이상 사용할 수 . 이러한 변수를 영구적으로 설정할 수 있는지 궁금합니다. 그 이유는 설정 파일을 (db 이름 등) 로컬 및 dev 환경에 대한 모든 설치없이 전환 할 수 있도록 "설치"파일을 만들려는 것입니다 ... 한 번만 setup.go를 실행하십시오. .

+2

쉘에서 실행하는 프로세스에서 쉘의 환경 변수를 설정한다는 것을 올바르게 이해하고 있습니까? –

+4

그것은 환경 변수가 작동하는 방식이 아닙니다. 자식 프로세스는 부모로부터 상속받을 수만 있고 반대로 상속받을 수는 없습니다. – JimB

답변

5

약식 : 불가능합니다. 상위 프로세스의 환경은 변경할 수 없습니다. 자신의 것을 바꿔 자녀에게 양도 할 수 있습니다.

구성 파일을 유지 관리해야합니다. 많은 설정 라이브러리가 있습니다. ini, yaml 등

프로그램이 구성을 변경하면 변경 될 때마다 또는 변경 사항이있을 때마다 또는 프로세스가 종료 될 때마다 디스크에 저장하십시오.

0

원하는 동작을 얻을 수있는 유일한 방법은 현재 쉘의 환경을 변경할 수 있으며, 가장 쉬운 방법은 간단한 쉘 스크립트입니다

# setup.sh 
export DBHOST="dbhost.url" 
export CONFIG_VAR_TWO="testing" 

다음

$ source setup.sh 
0

그것은이다 레지스트리에 값을 쓸 수는 있지만 가능하면 응용 프로그램에 관리자 권한이 필요합니다.

func setEnvironment(key string, value string){ 
    k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SYSTEM\ControlSet001\Control\Session Manager\Environment`, registry.ALL_ACCESS) 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer k.Close() 

    err = k.SetStringValue(key, value) 
    if err != nil { 
     log.Fatal(err) 
    } 
} 
0

가능한 것으로 생각하지는 않지만, 종료하는 일부 CLI 도구를 빌드하는 경우 STDOUT에 해당하는 셸을 docker-machine eval과 같이 출력하는 것을 고려할 수 있습니다.

신속하고 더러운 예 :

package main 

import (
    "fmt" 
    "reflect" 
    "strings" 
) 

type config struct { 
    db_host string 
    db_port int 
    db_user string 
} 

func main() { 
    c := config{"db.example.com", 3306, "user1"} 

    ct := reflect.ValueOf(&c).Elem() 
    typeOfC := ct.Type() 

    for i := 0; i < ct.NumField(); i++ { 
    f := ct.Field(i) 
    fmt.Printf("%s=%v\n", strings.ToUpper(typeOfC.Field(i).Name), f) 
    } 
} 

Output: 
$ go run env.go 
DB_HOST=db.example.com 
DB_PORT=3306 
DB_USER=user1 

당신은 다음 eval 그 명령 행에서 그 변수에 액세스 할 수 있습니다.

$ eval $(go run env.go) 
$ echo $DB_HOST 
db.example.com 
관련 문제