登录
首页 >  Golang >  Go问答

无法使用 exec.Command 在 Go 中将信息传输到管道或追加到 .txt 文件,是否存在语法错误?

来源:stackoverflow

时间:2024-03-07 09:42:24 489浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《无法使用 exec.Command 在 Go 中将信息传输到管道或追加到 .txt 文件,是否存在语法错误?》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

我一直在尝试运行一个命令,以便不必使用 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 脚本中它们会起作用。 如果您发现有问题,请告诉我。


解决方案


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

  • 通过 shell 运行它。

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

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)
}

到这里,我们也就讲完了《无法使用 exec.Command 在 Go 中将信息传输到管道或追加到 .txt 文件,是否存在语法错误?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>