Golang中的Shell扩展(命令替换)

Go has the support for variable expansion, for example:

os.ExpandEnv("test-${USER}")`

>> "test-MyName"

But is there a way of expanding executables, as the way the shell behaves?

Something like

os.ExpandExecutable("test-$(date +%H:%M)")

>> "test-18:20"

I cannot find an equivalent method for this, is there an elegant way of doing this instead of manually extracting the placeholders out, executing and then replacing them?

There's no built in function for this, but you can write a function and pass it to os.Expand().

package main

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

func RunProgram(program string) string {
    a := strings.Split(program, " ")
    out, err := exec.Command(a[0], a[1:]...).Output()
    if err != nil {
        panic(err)
    }
    return string(out)
}

// You then call it as:

func main() {
    s := os.Expand("test-${date +%H:%M}", RunProgram)
    fmt.Print(s)
}

This outputs:

test-13:09

Note that os.Expand() expects curly braces, i.e. ${command args args args}.