package main import ( "errors" "fmt" "os" ) var commaSh = `#!/bin/sh script_path=$(realpath $0) script_dir=$(dirname $script_path) cd $script_dir output=/tmp/commandgo # why not just using "go run ." ? # Because "go run ." will inject GOBIN into PATH while compiling, # and modifed PATH will pass into actual program. # So the program doesn't have the same PATH as outside. # It's not a acceptable behavior. go build -o $output . && $output $@ ` func commandsUsage() string { return fmt.Sprintf( `commands: path %v `, commandPathDescription) } func main() { pwd, err := os.Getwd() if err != nil { panic(fmt.Errorf("detect current directory failed! %w", err)) } target := pwd + string(os.PathSeparator) + "," _, err = os.Stat(target) if errors.Is(err, os.ErrNotExist) { err := os.WriteFile(target, []byte(commaSh), 0755) if err != nil { panic(fmt.Errorf("write sh failed: %w", err)) } } if len(os.Args) >= 2 { switch os.Args[1] { case "path": commandPath(os.Args[1:]) default: fmt.Printf("unknow command `%v`\n\n", os.Args[1]) fmt.Printf("%v", commandsUsage()) os.Exit(1) } } else { fmt.Println("Personal scripts set written in Golang\n") fmt.Printf("%v", commandsUsage()) } }