diff --git a/system/os.go b/system/os.go index 55ac2e9..2924b33 100644 --- a/system/os.go +++ b/system/os.go @@ -15,6 +15,10 @@ import ( "golang.org/x/text/encoding/simplifiedchinese" ) +type ( + Option func(*exec.Cmd) +) + // IsWindows check if current os is windows. // Play: https://go.dev/play/p/XzJULbzmf9m func IsWindows() bool { @@ -66,7 +70,7 @@ func CompareOsEnv(key, comparedEnv string) bool { // in linux, use /bin/bash -c to execute command // in windows, use powershell.exe to execute command // Play: https://go.dev/play/p/n-2fLyZef-4 -func ExecCommand(command string) (stdout, stderr string, err error) { +func ExecCommand(command string, opts ...Option) (stdout, stderr string, err error) { var out bytes.Buffer var errOut bytes.Buffer @@ -74,6 +78,12 @@ func ExecCommand(command string) (stdout, stderr string, err error) { if IsWindows() { cmd = exec.Command("powershell.exe", command) } + + for _, opt := range opts { + if opt != nil { + opt(cmd) + } + } cmd.Stdout = &out cmd.Stderr = &errOut diff --git a/system/os_linux.go b/system/os_linux.go new file mode 100644 index 0000000..ce6bfbe --- /dev/null +++ b/system/os_linux.go @@ -0,0 +1,18 @@ +package system + +import ( + "os/exec" + "syscall" +) + +func WithForeground() Option { + return func(c *exec.Cmd) { + if c.SysProcAttr == nil { + c.SysProcAttr = &syscall.SysProcAttr{ + Foreground: true, + } + } else { + c.SysProcAttr.Foreground = true + } + } +} diff --git a/system/os_windows.go b/system/os_windows.go new file mode 100644 index 0000000..db38238 --- /dev/null +++ b/system/os_windows.go @@ -0,0 +1,18 @@ +package system + +import ( + "os/exec" + "syscall" +) + +func WithWinHide() Option { + return func(c *exec.Cmd) { + if c.SysProcAttr == nil { + c.SysProcAttr = &syscall.SysProcAttr{ + HideWindow: true, + } + } else { + c.SysProcAttr.HideWindow = true + } + } +}