我正在尝试交叉编译一个将执行 bash 脚本的 Go 程序。是否可以将 bash 脚本嵌入到二进制文件中?
我引用过: Golang从内存中提供静态文件
但不确定这是否适用于执行 bash 脚本。我在这里错过了什么吗?一些澄清或指示将会非常有帮助,谢谢!
由于bash可以从 执行脚本,因此您只需通过stdin发送脚本到命令。bashcommand.Stdin
一个没有 go 的例子embed:
package main
import (
"bytes"
"fmt"
"os/exec"
"strings"
)
var script = `
echo $PWD
pwd
echo "-----------------------------------"
# print process
ps aux | grep code
`
func main() {
c := exec.Command("bash")
c.Stdin = strings.NewReader(script)
b, e := c.Output()
if e != nil {
fmt.Println(e)
}
fmt.Println(string(b))
}
Run Code Online (Sandbox Code Playgroud)
对于 go 1.16 embed( https://golang.org/pkg/embed/ ):
package main
import (
"bytes"
_ "embed"
"fmt"
"os/exec"
"strings"
)
//go:embed script.sh
var script string
func main() {
c := exec.Command("bash")
c.Stdin = strings.NewReader(script)
b, e := c.Output()
if e != nil {
fmt.Println(e)
}
fmt.Println(string(b))
}
Run Code Online (Sandbox Code Playgroud)
使用 向脚本传递参数-s -。
以下示例将传递-la /etc给脚本。
package main
import (
"fmt"
"os/exec"
"strings"
)
func main() {
// pass parameters to your script as a safe way.
c := exec.Command("sh", "-s", "-", "-la", "/etc")
// use $1, $2, ... $@ as usual
c.Stdin = strings.NewReader(`
echo $@
ls $1 "$2"
`)
b, e := c.Output()
if e != nil {
fmt.Println(e)
}
fmt.Println(string(b))
}
Run Code Online (Sandbox Code Playgroud)
游乐场:https://go.dev/play/p/T1lMSrXcOIL
小智 -1
您是否尝试将流数据(根据参考 go-bindata 提供了一个返回 []byte 的函数)写入临时文件?
请参阅: http: //golang.org/pkg/io/ioutil/#TempFile
然后你可以使用系统调用来执行它
http://golang.org/pkg/syscall/#Exec
其中第一个参数必须是 shell。
| 归档时间: |
|
| 查看次数: |
5328 次 |
| 最近记录: |