├── README.md ├── go.mod ├── main.go └── renovate.json /README.md: -------------------------------------------------------------------------------- 1 | # shellwrap 2 | 3 | shell wrapper for Windows 4 | 5 | ## Usage 6 | 7 | ``` 8 | C:\>shellwrap echo $OS 9 | Windows_NT 10 | ``` 11 | 12 | ``` 13 | C:\>shellwrap notepad $(ver).txt 14 | ``` 15 | 16 | ## Installation 17 | 18 | ``` 19 | $ go get github.com/mattn/shellwrap 20 | ``` 21 | 22 | If you want to run the process with shell (i.e. cmd.exe), use `-s` flag. 23 | 24 | ## License 25 | 26 | MIT 27 | 28 | ## Author 29 | 30 | Yasuhiro Matsumoto (a.k.a. mattn) 31 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/mattn/shellwrap 2 | 3 | go 1.12 4 | 5 | require github.com/mattn/go-shellwords v1.0.9 6 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | "os/exec" 7 | "syscall" 8 | "unsafe" 9 | 10 | "github.com/mattn/go-shellwords" 11 | ) 12 | 13 | func main() { 14 | us := syscall.GetCommandLine() 15 | p := (*[0xffff]uint16)(unsafe.Pointer(us)) 16 | s := syscall.UTF16ToString(p[:]) 17 | parser := shellwords.NewParser() 18 | parser.ParseEnv = true 19 | parser.ParseBacktick = true 20 | args, err := parser.Parse(s) 21 | if err != nil { 22 | fmt.Fprintln(os.Stderr, err) 23 | os.Exit(1) 24 | } 25 | args = args[1:] 26 | 27 | useshell := false 28 | if len(args) > 0 && args[0] == "-s" { 29 | useshell = true 30 | args = args[1:] 31 | } 32 | 33 | if len(args) == 0 { 34 | os.Exit(1) 35 | } 36 | 37 | var cmdargs []string 38 | if useshell { 39 | cmdargs = []string{"cmd", "/c"} 40 | cmdargs = append(cmdargs, args...) 41 | } else { 42 | cmdargs = args 43 | } 44 | cmd := exec.Command(cmdargs[0], cmdargs[1:]...) 45 | cmd.Stdin = os.Stdin 46 | cmd.Stdout = os.Stdout 47 | cmd.Stderr = os.Stderr 48 | err = cmd.Run() 49 | if err != nil { 50 | fmt.Fprintln(os.Stderr, err) 51 | os.Exit(1) 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base" 4 | ] 5 | } 6 | --------------------------------------------------------------------------------