gpt4 book ai didi

go - 从带有参数的字符串运行命令

转载 作者:IT王子 更新时间:2023-10-29 01:18:07 24 4
gpt4 key购买 nike

我正在尝试使用 go 运行命令。命令在字符串中。

package main

import (
"log"
"os"
"os/exec"
"strings"

"github.com/davecgh/go-spew/spew"
)

func main() {
commandToRun := `echo $HOME`

log.Printf("Running %s\n", commandToRun)

args := strings.Fields(commandToRun)
spew.Dump(args[1:len(args)])
command := exec.Command(args[0], args[1:len(args)]...)
command.Stdout = os.Stdout
command.Stdin = os.Stdin
command.Stderr = os.Stderr
err := command.Run()

if err != nil {
log.Printf("Command finished with error: %v", err)
}
}

输出是:

2018/11/14 09:41:22 Running echo $HOME
([]string) (len=1 cap=1) {
(string) (len=5) "$HOME"
}
$HOME

我想要的是:

2018/11/14 09:41:22 Running echo $HOME
([]string) (len=1 cap=1) {
(string) (len=5) "$HOME"
}
/home/whatever

看起来 go 正在以某种方式清理字符串。所以 $HOME 没有展开。有没有什么方法可以像在 shell 中输入一样完全运行字符串?

这是重要的部分。理想情况下,我想在当前 shell 中从字符串转换为类型。

编辑:下面的例子解决了最简单的场景,但没有涵盖“运行字符串就好像它被输入到 shell 中一样”部分。

如果我切换到expandenv:

commandToRun := os.ExpandEnv(`echo "$HOME"`)

我得到:

2018/11/14 11:45:44 Running echo "/Users/rafael"
([]string) (len=1 cap=1) {
(string) (len=15) "\"/home/whatever\""
}
"/home/whatever"

我在 shell 中得到的是:

$ > echo "$HOME"
/home/whatever

没有引号。

这接近我想要的,但又不完全是。

最佳答案

$HOME(以及所有其他环境变量)由 shell 扩展。您没有执行 shell,因此它们不会展开。

你需要直接在 go 中查找 env 变量,像这样:

command := exec.Command("echo", os.Getenv("HOME"))

或者这个:

commandToRun := os.ExpandEnv("echo $HOME")
command := exec.Command(strings.Fields(commandToRun)...)

请注意,如果 $HOME 扩展为包含空格的字符串,最后一种方法将不起作用,因此 os.Getenv 方法通常更安全/更适合此用途案例。

关于go - 从带有参数的字符串运行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53296126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com