diff --git a/internal/externalcmd/cmd.go b/internal/externalcmd/cmd.go index 34701a13..6d21bf91 100644 --- a/internal/externalcmd/cmd.go +++ b/internal/externalcmd/cmd.go @@ -1,6 +1,7 @@ package externalcmd import ( + "strings" "time" ) @@ -31,6 +32,10 @@ func NewCmd( env Environment, onExit func(int), ) *Cmd { + for key, val := range env { + cmdstr = strings.ReplaceAll(cmdstr, "$"+key, val) + } + e := &Cmd{ pool: pool, cmdstr: cmdstr, diff --git a/internal/externalcmd/cmd_unix.go b/internal/externalcmd/cmd_unix.go index 54ee202e..cf23740d 100644 --- a/internal/externalcmd/cmd_unix.go +++ b/internal/externalcmd/cmd_unix.go @@ -7,10 +7,17 @@ import ( "os" "os/exec" "syscall" + + "github.com/kballard/go-shellquote" ) func (e *Cmd) runInner() (int, bool) { - cmd := exec.Command("/bin/sh", "-c", "exec "+e.cmdstr) + cmdparts, err := shellquote.Split(e.cmdstr) + if err != nil { + return 0, true + } + + cmd := exec.Command(cmdparts[0], cmdparts[1:]...) cmd.Env = append([]string(nil), os.Environ()...) for key, val := range e.env { @@ -20,7 +27,7 @@ func (e *Cmd) runInner() (int, bool) { cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr - err := cmd.Start() + err = cmd.Start() if err != nil { return 0, true } diff --git a/internal/externalcmd/cmd_win.go b/internal/externalcmd/cmd_win.go index 6513764d..a1dfc3b4 100644 --- a/internal/externalcmd/cmd_win.go +++ b/internal/externalcmd/cmd_win.go @@ -6,25 +6,17 @@ package externalcmd import ( "os" "os/exec" - "strings" "github.com/kballard/go-shellquote" ) func (e *Cmd) runInner() (int, bool) { - // On Windows, the shell is not used and command is started directly. - // Variables are replaced manually in order to guarantee compatibility - // with Linux commands. - tmp := e.cmdstr - for key, val := range e.env { - tmp = strings.ReplaceAll(tmp, "$"+key, val) - } - parts, err := shellquote.Split(tmp) + cmdparts, err := shellquote.Split(e.cmdstr) if err != nil { return 0, true } - cmd := exec.Command(parts[0], parts[1:]...) + cmd := exec.Command(cmdparts[0], cmdparts[1:]...) cmd.Env = append([]string(nil), os.Environ()...) for key, val := range e.env {