[英]Go: embed bash script in binary
我正在嘗試交叉編譯一個將執行 bash 腳本的 Go 程序。 是否可以在二進制文件中嵌入 bash 腳本?
我參考了: Golang 從內存中提供靜態文件
不確定這是否適用於執行 bash 腳本。 我在這里錯過了什么嗎? 一些澄清或指示將非常有幫助,謝謝!
由於bash
可以從stdin
執行腳本,您只需通過command.Stdin
將腳本發送到bash
命令。
一個沒有 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.16 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))
}
你實際上可以直接與 Go 中的系統 shell 交互。 根據您的 bash 腳本中的內容,您可能可以完全轉換所有內容。 例如,處理文件、提取檔案、輸出文本、請求用戶輸入、下載文件等等都可以在 Go 中本地完成。 對於任何你絕對需要 shell 的東西,你總是可以使用golang.org/pkg/os/exec 。
我寫了一個片段來演示一個非常簡單的基於 Go 的命令 shell。 基本上它在用戶和外殼之間傳輸輸入、輸出和錯誤。 它可以交互使用或直接運行大多數 shell 命令。 我在這里提到它主要是為了展示 Go 的操作系統功能。 查看: github.com/lee8oi/goshell.go
您是否嘗試將流數據(根據參考 go-bindata 提供了一個返回 []byte 的函數)寫入臨時文件?
見: http : //golang.org/pkg/io/ioutil/#TempFile
然后您可以使用系統調用執行它
http://golang.org/pkg/syscall/#Exec
其中第一個參數需要是一個 shell。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.