英文:
Golang: execute text/template as bash script
问题
给定以下代码:
import (
    "bytes"
    "code.google.com/p/go/src/pkg/text/template"
)
....
var tmp = template.Must(template.New("").Parse(`
    echo {{.Name}}
    echo {{.Surname}}
`[1:]))
var buf bytes.Buffer
tmp.Execute(&buf, struct{Name string, Surname: string}{"James","Dean"})
bashScript := string(buf)
// 现在,我该如何执行这个 bash 脚本?
magic.Execute(bashScript)
有没有一个神奇的函数可以将字符串作为一个 bash 脚本执行?"os/exec".Command 只能一次执行一个命令。
英文:
Given the following:
   import(
   "bytes"
   "code.google.com/p/go/src/pkg/text/template"
   )
   ....
   var tmp = template.Must(template.New("").Parse(`
   echo {{.Name}}
   echo {{.Surname}}
   `[1:]))
   var buf bytes.Buffer
   tmp.Execute(&buf, struct{Name string, Surname: string}{"James","Dean"})
   bashScript = string(buf)
   
   // Now, how do I execute the bash script?
   magic.Execute(bashScript)
Is there a magic function that will execute the string as one bash script? "os/exec".Command can execute only one command at a time.
答案1
得分: 6
如果你想执行多个命令,尤其是同时执行多个命令,bash 不是最好的方法。可以使用 os/exec 和 goroutines。
如果你真的想运行一个 bash 脚本,这里有一个使用 os/exec 的示例。我假设你想要看到 bash 脚本的输出,而不是保存和处理它(但你可以很容易地使用 bytes.Buffer 来实现)。为了简洁起见,我在这里省略了所有的错误检查。完整版本的代码可以在这里找到。
package main
import (
        "bytes"
        "io"
        "text/template"
        "os"
        "os/exec"
        "sync"
)
func main() {
        var tmp = template.Must(template.New("").Parse(`
echo {{.Name}}
echo {{.Surname}}
`[1:]))
        var script bytes.Buffer
        tmp.Execute(&script, struct {
                Name    string
                Surname string
        }{"James", "Dean"})
        bash := exec.Command("bash")
        stdin, _ := bash.StdinPipe()
        stdout, _ := bash.StdoutPipe()
        stderr, _ := bash.StderrPipe()
        wait := sync.WaitGroup{}
        wait.Add(3)
        go func () {
                io.Copy(stdin, &script)
                stdin.Close()
                wait.Done()
        }()
        go func () {
                io.Copy(os.Stdout, stdout)
                wait.Done()
        }()
        go func () {
                io.Copy(os.Stderr, stderr)
                wait.Done()
        }()
        bash.Start()
        wait.Wait()
        bash.Wait()
}
英文:
If you want to execute more than one command, especially more than one at a time, bash is not the best way to do that. Use os/exec and goroutines.
If you really want to run a bash script, here's an example using os/exec. I assumed you wanted to see the output of the bash script, rather than save it and process it (but you can easily do that with a bytes.Buffer). I've removed all the error checking here for brevity. The full version with error checking is here.
<pre>
package main
import (
"bytes"
"io"
"text/template"
"os"
"os/exec"
"sync"
)
func main() {
var tmp = template.Must(template.New("").Parse([1:]))
echo {{.Name}}
echo {{.Surname}}
    var script bytes.Buffer
    tmp.Execute(&script, struct {
            Name    string
            Surname string
    }{"James", "Dean"})
    bash := exec.Command("bash")
    stdin, _ := bash.StdinPipe()
    stdout, _ := bash.StdoutPipe()
    stderr, _ := bash.StderrPipe()
    wait := sync.WaitGroup{}
    wait.Add(3)
    go func () {
            io.Copy(stdin, &script)
            stdin.Close()
            wait.Done()
    }()
    go func () {
            io.Copy(os.Stdout, stdout)
            wait.Done()
    }()
    go func () {
            io.Copy(os.Stderr, stderr)
            wait.Done()
    }()
    bash.Start()
    wait.Wait()
    bash.Wait()
}
</pre>
答案2
得分: -1
使用 bash -c... exec.Command("bash", "-c", bashScript)。
英文:
Use bash -c... exec.Command("bash", "-c", bashScript).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论