亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 go 程序退出后,在 shell 上保留為 env 變量設置的值

在 go 程序退出后,在 shell 上保留為 env 變量設置的值

Go
慕尼黑5688855 2021-12-27 10:41:18
有沒有辦法可以在我的 shell 上設置一個環境變量并讓它在 go 程序退出后保持不變?我嘗試了以下bash-3.2$ export WHAT=ambash-3.2$ echo $WHATambash-3.2$ go build tt.go bash-3.2$ ./ttamis your namebash-3.2$ echo $WHATambash-3.2$ 代碼是:package main`import (        "fmt"       "os"`)func main() {fmt.Println(os.Getenv("WHAT"))os.Setenv("WHAT", "is your name")fmt.Println(os.Getenv("WHAT"))}謝謝
查看完整描述

3 回答

?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

不能,環境變量只能向下傳遞,不能向上傳遞。你正在嘗試做后者。


您的流程樹:


`--- shell

          `--- go program

          |

          `--- other program

go 程序必須將環境變量傳遞給 shell,以便其他程序可以訪問它。


您可以做的是程序喜歡ssh-agent做的事情:返回一個字符串,該字符串可以被解釋為設置一個環境變量,然后可以由 shell 對其進行評估。


例如:


func main() {

    fmt.Println("WHAT='is your name'")

}

運行它會給你:


$ ./goprogram

WHAT='is your name'

評估打印的字符串會給你想要的效果:


$ eval `./goprogram`

$ echo $WHAT

is your name


查看完整回答
反對 回復 2021-12-27
?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

不。

進程擁有其父環境的副本,并且無法寫入父環境。


查看完整回答
反對 回復 2021-12-27
?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

其他答案嚴格正確,但是您可以自由執行 golang 代碼,將環境變量的任意值填充到 go 創建的輸出文件中,然后返回到您執行 go 二進制文件的父環境中,然后將 go 的輸出文件源到從你的 go 代碼中計算出可用的 env 變量......這可能是你的 go 代碼 write_to_file.go


package main


import (

    "io/ioutil"

)


func main() {


    d1 := []byte("export whodunit=calculated_in_golang\n")

    if err := ioutil.WriteFile("/tmp/cool_file", d1, 0644); err != nil {

        panic(err)

    }

}

現在將上面的 write_to_file.go 編譯成二進制文件write_to_file……這是一個 bash 腳本,它可以作為父文件執行上面的二進制文件


#!/bin/bash


whodunit=aaa


if [[ -z $whodunit ]]; then


    echo variable whodunit has no value

else


    echo variable whodunit has value $whodunit

fi


./write_to_file # <-- execute golang binary here which populates an exported var in output file /tmp/cool_file


curr_cool=/tmp/cool_file


if [[ -f $curr_cool ]]; then # if file exists


    source /tmp/cool_file # shell distinguishes sourcing shell from executing, sourcing does not cut a subshell it happens in parent env

fi


if [[ -z $whodunit ]]; then


    echo variable whodunit still has no value 

else


    echo variable whodunit finally has value $whodunit

fi

這是執行上述 shell 腳本的輸出


variable whodunit has value aaa

variable whodunit finally has value calculated_in_golang


查看完整回答
反對 回復 2021-12-27
  • 3 回答
  • 0 關注
  • 227 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號