我正在尝试使用 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
没有引号。
这接近我想要的,但不完全是。
沧海一幻觉
PIPIONE
明月笑刀无情
ITMISS
相关分类