为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕标5832272 2023-07-31 15:51:01
我一直在尝试运行一个命令,以便不必使用 bash 脚本,而是使用 go 来运行命令。HOME=/home/gogopowerrangers 在 ubuntu 18.04 上const systemInfoLoc string = "$HOME/systemvar.txt"//I've tried to run with full path as well heregetSystemKernel := exec.Command("uname", "-s", ">>", "home/username/system.txt")getSystemKernel.Run()//^doesn't seem to return anything//orgetsystemvar,_ = exec.Command("echo", "$USER", ">", "$HOME/systemvar.txt").Outputfmt.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 脚本中它们会起作用。如果您发现有问题,请告诉我。
查看完整描述

2 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

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)

}


查看完整回答
反对 回复 2023-07-31
?
郎朗坤

TA贡献1921条经验 获得超9个赞

间接是 shell 的一项功能。如果您想使用间接,您有以下两种选择之一:

  • 通过 shell 运行它。

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


查看完整回答
反对 回复 2023-07-31
  • 2 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信