4 回答

TA貢獻1824條經驗 獲得超5個贊
$HOME(以及所有其他環(huán)境變量)由 shell 擴展。您沒有執(zhí)行 shell,因此它們不會擴展。
您需要直接在 go 中查找 env 變量,例如:
command := exec.Command("echo", os.Getenv("HOME"))
或這個:
commandToRun := os.ExpandEnv("echo $HOME")
args := strings.Fields(commandToRun)
command := exec.Command(args[0], args[1:]...)
$HOME請注意,如果擴展為包含空格的字符串,最后一種方法將不起作用,因此該os.Getenv方法通常更安全/更適合此用例。

TA貢獻1829條經驗 獲得超9個贊
在執(zhí)行命令之前,您可以使用以下方式主動擴展字符串中的所有環(huán)境變量os.ExpandEnv
:
os.ExpandEnv("echo?$HOME")
從文檔:
ExpandEnv 根據當前環(huán)境變量的值替換字符串中的${var} 或$var。對未定義變量的引用將替換為空字符串。

TA貢獻1828條經驗 獲得超4個贊
如果您想獲得 的輸出$ echo $HOME
,您需要的最少代碼是
fmt.Println(os.Getenv("HOME"))
不需要更多了。
如果你使用
os.ExpandEnv("echo $HOME")
,那么首先$HOME
var 將被擴展然后它會給你一個像這樣的字符串echo /home/<user>
如果您使用
command := exec.Command("echo", os.Getenv("HOME"))
, 那么它將被解析為command := exec.Command("echo", "/home/<user>")
finally 這將給出輸出/home/<user>
如果你使用
commandToRun := os.ExpandEnv("echo $HOME") command := exec.Command(strings.Fields(commandToRun)...)
那么它將像以前的案例一樣處理。
所以更好的方法是只使用fmt.Println(os.Getenv("HOME"))
.

TA貢獻1871條經驗 獲得超8個贊
您需要運行一個 shell。在 Go 中擴展它似乎很愚蠢并且容易出錯,因為你有一個可以運行的 shell。
commandToRun := `echo "$SHELL"` cmd := exec.Command("/bin/sh", "-c", commandToRun) command := exec.Command(args[0], args[1:len(args)]...) command.Stdout = os.Stdout command.Stdin = os.Stdin command.Stderr = os.Stderr err := command.Run()
這應該適用于任何 POSIX 系統(tǒng)。今天的孩子們在他們的命令行中加入了很多 bashisms,因此您可以將其切換為運行,/bin/bash
但請注意,這在 FreeBSD 或其他一些系統(tǒng)(其他 BSD 及其派生系統(tǒng))上不起作用。
- 4 回答
- 0 關注
- 164 瀏覽
添加回答
舉報