去执行。命令似乎无法将信息管道或追加到.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[]字符串传入,但这似乎没有什么区别。我知道如果我把这些写进CMD行,它们就可以工作,或者在bash脚本中。如果你发现什么不对劲,请告诉我。

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 stderr
getSystemKernel, err := exec.Command("uname", "-s").CombinedOutput()
if err != nil {
// Show error and output
log.Fatalf("%s: %s", err, getSystemKernel)
}
// Write result to file
err = ioutil.WriteFile("home/username/system.txt", getSystemKernel, 0644)
if err != nil {
log.Fatal(err)
}

Indirection是shell的一个功能。如果你想使用间接寻址,你有两个选择之一:

  • 通过shell运行它。

    getSystemKernel := exec.Command("/bin/sh", "-c", "uname -s >> home/username/system.txt")
    
  • 使用os/exec包,自己处理程序的输出流。

最新更新