2013-06-28 41 views
6

我有這樣的代碼,我只是想設置一個環境變量:環境變量沒有用「OS」包設置之後在終端會話設置

package main 

import (
    "os" 
    "fmt" 
) 

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

運行此文件:

>$ go run file.go 
BAR 

fmt.Println致電打印BAR正確,但後來我預計這個env變量也會設置在我的會話中,但是:

>$ echo $FOO 

>$ 

$FOO沒有什麼,它是空的。這是一個預期的行爲?如果是這樣,我怎樣才能讓這個env變量在我的會話中持續保持,像這樣的go程序?

回答

11

創建新進程時,會複製父進程的環境。新進程中環境的更改不會影響父進程。在修改環境之後,您必須讓程序啓動一個shell。

7

不確定這最終是你想要做什麼,但它確實會給你你要求的結果。

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

這將用一個新的shell替換go進程與修改的環境。

您可能會想將其稱爲「exec APPNAME」,因爲這將避免在shell中有一個shell。

例如:

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

你最終將與修改後的環境是bash shell