4 回答
TA贡献1824条经验 获得超5个赞
$HOME(以及所有其他环境变量)由 shell 扩展。您没有执行 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个赞
在执行命令之前,您可以使用以下方式主动扩展字符串中的所有环境变量os.ExpandEnv
:
os.ExpandEnv("echo $HOME")
从文档:
ExpandEnv 根据当前环境变量的值替换字符串中的${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 系统。今天的孩子们在他们的命令行中加入了很多 bashisms,因此您可以将其切换为运行,/bin/bash
但请注意,这在 FreeBSD 或其他一些系统(其他 BSD 及其派生系统)上不起作用。
- 4 回答
- 0 关注
- 111 浏览
添加回答
举报