package main import ( "bufio" "fmt" "io/ioutil" "log" "os" "os/exec" "strings" "github.com/gabriel-vasile/mimetype" ) func main() { if len(os.Args) != 2 { log.Fatal("'open' get's exactly one argument") } file := os.Args[1] home := os.Getenv("HOME") var prog string mtype, err := mimetype.DetectFile(file) if err != nil { log.Fatalf("%v", err) } dirpath := home + "/.open/" os.MkdirAll(dirpath, 0775) opener_file := dirpath + mtype.Extension() if _, err := os.Stat(opener_file); err == nil { content, err := ioutil.ReadFile(opener_file) if err != nil { log.Fatalf("%v", err) } prog = string(content) } else { fmt.Printf("Don't know how to open '%s' file. What program should I use? ", mtype.Extension()) reader := bufio.NewReader(os.Stdin) prog_string, err := reader.ReadString('\n') if err != nil { log.Fatal(err) } prog_string = string(prog_string[0 : len(prog_string)-1]) prog = strings.Clone(prog_string) s := []byte(prog_string) err = ioutil.WriteFile(opener_file, s, 0644) if err != nil { log.Fatal(err) } } command := strings.Split(prog, " ") out, err := exec.Command(command[0], command[1:]...).Output() if err != nil { log.Fatal(err) } fmt.Println(string(out)) }