2013-06-28 17 views
6

tôi có mã này, nơi tôi chỉ muốn thiết lập một biến môi trường:biến môi trường không được thiết lập trong phiên giao dịch cuối sau khi cài đặt nó với gói "os"

package main 

import (
    "os" 
    "fmt" 
) 

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

Chạy tập tin này:

>$ go run file.go 
BAR 

Các fmt.Println gọi in BAR một cách chính xác, nhưng sau đó tôi mong đợi biến env này được đặt trên phiên của tôi là tốt, tuy nhiên:

>$ echo $FOO 

>$ 

Không có gì trên $FOO, nó trống. Đây có phải là hành vi mong đợi không? Nếu vậy, làm thế nào tôi có thể làm cho biến này env để tồn tại trên phiên của tôi thiết lập nó với một chương trình go như thế này?

Trả lời

11

Khi quy trình mới được tạo, môi trường của quy trình gốc được sao chép. Những thay đổi đối với môi trường trong quy trình mới không ảnh hưởng đến tiến trình cha mẹ. Bạn sẽ phải bắt đầu chương trình của mình sau khi sửa đổi môi trường.

7

Không chắc chắn điều này là cuối cùng những gì bạn muốn làm, nhưng nó cung cấp cho bạn kết quả bạn yêu cầu.

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

Điều này thay thế quy trình đi bằng vỏ mới với môi trường đã sửa đổi.

Bạn có thể muốn gọi nó là "exec APPNAME", vì điều đó sẽ tránh có vỏ trong trình bao.

dụ:

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

bạn sẽ kết thúc với một vỏ bash với môi trường sửa đổi

Các vấn đề liên quan