我正在尝试交叉编译将执行bash脚本的Go程序。是否可以将bash脚本嵌入二进制文件中?
我引用了: Golang serve static files from memory
不确定这是否适用于执行bash脚本。我在这里错过了什么吗?一些澄清或指示将非常有用,谢谢!
答案 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传递;这是一个野外的例子:
答案 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。