2013-06-28 9 views
6

Ho questo codice in cui voglio solo impostare una variabile di ambiente:variabile d'ambiente non è impostata sulla sessione terminale dopo aver impostato con pacchetto "os"

package main 

import (
    "os" 
    "fmt" 
) 

func main() { 
    _ = os.Setenv("FOO", "BAR") 
    fmt.Println(os.Getenv("FOO")) 
} 

esecuzione di questo file:

>$ go run file.go 
BAR 

I fmt.Println stampe chiamata BAR correttamente, ma poi mi aspettavo questa variabile ENV essere impostata sulla mia sessione così, però:

>$ echo $FOO 

>$ 

Non c'è niente su $FOO, è vuoto. È un comportamento previsto? In tal caso, come posso rendere questa variabile env permanente sulla mia sessione impostandola con un programma go come questo?

risposta

11

Quando viene creato un nuovo processo, viene copiato l'ambiente del processo padre. Le modifiche all'ambiente nel nuovo processo non influiscono sul processo principale. Dovresti avere il tuo programma avviare una shell dopo aver modificato l'ambiente.

7

Non è sicuro che questo è in definitiva ciò che si vuole fare, ma ti dà il risultato che hai richiesto.

package main 
import (
     "os" 
     "syscall" 
) 
func main() { 
     os.Setenv("FOO", "BAR") 
     syscall.Exec(os.Getenv("SHELL"), []string{os.Getenv("SHELL")}, syscall.Environ()) 
} 

Sostituisce il processo go con una nuova shell con l'ambiente modificato.

Probabilmente si vorrebbe chiamarlo "exec APPNAME", in quanto eviterà di avere una shell in una shell.

esempio:

#!/bin/bash 
exec go-env-setter-app 

vi ritroverete con una shell bash con l'ambiente modificato

Problemi correlati