Go:用二进制嵌入bash脚本

时间:2015-01-05 12:59:51

标签: bash go

我正在尝试交叉编译将执行bash脚本的Go程序。是否可以将bash脚本嵌入二进制文件中?

我引用了: Golang serve static files from memory

不确定这是否适用于执行bash脚本。我在这里错过了什么吗?一些澄清或指示将非常有用,谢谢!

5 个答案:

答案 0 :(得分:3)

是的,您可以使用go-bindata在二进制文件中包含任何文件: https://github.com/jteeuwen/go-bindata

我还制作了制作Go / Bash混合应用的工具: https://github.com/progrium/go-basher

答案 1 :(得分:1)

由于 bash 可以从 stdin 执行脚本,您只需通过 bash 将脚本发送到 command.Stdin 命令。

没有 go embed 的示例:

package main

import (
    "bytes"
    "fmt"
    "os/exec"
)

var script = `
echo $PWD
pwd
echo "-----------------------------------"
# print process
ps aux | grep code
`

func main() {
    c := exec.Command("bash")
    var buf = new(bytes.Buffer)
    buf.WriteString(script)
    c.Stdin = buf

    b, e := c.Output()
    if e != nil {
        fmt.Println(e)
    }
    fmt.Println(string(b))
}

使用 go 1.6 embed (https://golang.org/pkg/embed/):

package main

import (
    "bytes"
    _ "embed"
    "fmt"
    "os/exec"
)

//go:embed script.sh
var script string

func main() {
    c := exec.Command("bash")
    var buf = new(bytes.Buffer)
    buf.WriteString(script)
    c.Stdin = buf

    b, e := c.Output()
    if e != nil {
        fmt.Println(e)
    }
    fmt.Println(string(b))
}

答案 2 :(得分:0)

如果你真的必须这样做,只需构造一个脚本并将其作为Stdin传递;这是一个野外的例子:

https://github.com/GoogleCloudPlatform/kubernetes/blob/63248f281f55698b520137d477631e87a3b02c4f/hack/e2e.go#L420

答案 3 :(得分:0)

您实际上可以直接与Go中的系统shell进行交互。根据bash脚本中的内容,您可以完全转换所有内容。例如,处理文件,提取存档,输出文本,请求用户输入,下载文件等等,可以在Go中本地完成。对于你绝对需要的任何东西,shell总是可以使用golang.org/pkg/os/exec

我写了一个片段,演示了一个非常简单的基于Go的命令shell。基本上它管道用户和shell之间的输入,输出和错误。它可以交互使用或直接运行大多数shell命令。我在这里提到它主要是为了演示Go的操作系统功能。看看:github.com/lee8oi/goshell.go

答案 4 :(得分:-1)

您是否尝试将流数据(根据引用go-bindata提供的函数返回[] byte)写入临时文件?

请参阅:http://golang.org/pkg/io/ioutil/#TempFile

然后您可以使用系统调用

执行它

http://golang.org/pkg/syscall/#Exec

第一个参数需要是shell。