我一直在尝试运行一个命令,不必使用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
包,自己处理程序的输出流。