Go exec.Command 似乎无法将信息通过管道传输或附加到 .txt 文件。我的语法错误吗?

我一直在尝试运行一个命令,以便不必使用 bash 脚本,而是使用 go 来运行命令。HOME=/home/gogopowerrangers 在 ubuntu 18.04 上


const systemInfoLoc string = "$HOME/systemvar.txt"


//I've tried to run with full path as well here

getSystemKernel := exec.Command("uname", "-s", ">>", "home/username/system.txt")

getSystemKernel.Run()

//^doesn't seem to return anything


//or

getsystemvar,_ = exec.Command("echo", "$USER", ">", "$HOME/systemvar.txt").Output

fmt.Println(string(getsystemvar))

//here even after the system doesn't seen to recognize $USER or $HOME or actually get the variables

我的语法错误吗?我可以将参数作为 args []string 传递,但这似乎没有什么区别。我知道如果我将它们写入 CMD 行或 bash 脚本中它们会起作用。如果您发现有问题,请告诉我。


慕标5832272
浏览 116回答 2
2回答

慕容3067478

exec.Command()不在 shell 内运行,它只运行命令。这对您来说意味着它不会扩展环境变量 ( $HOME) 或执行重定向 ( >, >>),因为这是 shell 的工作。exec.Command()除非绝对必要,否则我不建议在内部运行 shell ,因为所需的不受信任输入的引用可能很棘手,并且很可能出现错误(包括安全问题)。您可以使用os.ExpandEnv()或os.GetEnv()来加载环境变量。您可以通过读取输出然后将其写入所需的文件来进行重定向,例如使用ioutil.WriteFile().把它们放在一起看起来像(未经测试):// Expand the $HOME variable.systemInfoLoc := os.ExpandEnv("$HOME/systemvar.txt")// Run uname command and get both stdout and stderrgetSystemKernel, err := exec.Command("uname", "-s").CombinedOutput()if err != nil {    // Show error and output    log.Fatalf("%s: %s", err, getSystemKernel)}// Write result to fileerr = ioutil.WriteFile("home/username/system.txt", getSystemKernel, 0644)if err != nil {    log.Fatal(err)}

郎朗坤

间接是 shell 的一项功能。如果您想使用间接,您有以下两种选择之一:通过 shell 运行它。getSystemKernel := exec.Command("/bin/sh", "-c", "uname -s >> home/username/system.txt")使用该os/exec包,并自己处理程序的输出流。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go