github.com/madlambda/nash@v0.2.2-0.20230113003044-f2284521680b/internal/sh/util.go (about) 1 package sh 2 3 import ( 4 "fmt" 5 "io" 6 "math/rand" 7 "os" 8 "os/exec" 9 "strconv" 10 "syscall" 11 "time" 12 13 "github.com/madlambda/nash/sh" 14 ) 15 16 var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") 17 18 func init() { 19 rand.Seed(time.Now().UnixNano()) 20 } 21 22 func randRunes(n int) string { 23 b := make([]rune, n) 24 for i := range b { 25 b[i] = letterRunes[rand.Intn(len(letterRunes))] 26 } 27 return string(b) 28 } 29 30 func buildenv(e Env) []string { 31 env := make([]string, 0, len(e)) 32 33 for k, v := range e { 34 if v == nil { 35 continue 36 } 37 38 if v.Type() != sh.ListType && 39 v.Type() != sh.StringType { 40 continue 41 } 42 43 if v.Type() == sh.ListType { 44 vlist := v.(*sh.ListObj) 45 env = append(env, k+"=("+vlist.String()+")") 46 } else { 47 vstr := v.(*sh.StrObj) 48 env = append(env, k+"="+vstr.String()) 49 } 50 } 51 52 return env 53 } 54 55 func printVar(out io.Writer, name string, val sh.Obj) { 56 if val.Type() == sh.StringType { 57 valstr := val.(*sh.StrObj) 58 fmt.Fprintf(out, "%s = \"%s\"\n", name, valstr.Str()) 59 } else if val.Type() == sh.ListType { 60 vallist := val.(*sh.ListObj) 61 fmt.Fprintf(out, "%s = (%s)\n", name, vallist.String()) 62 } 63 } 64 65 func printEnv(out io.Writer, name string) { 66 fmt.Fprintf(out, "setenv %s\n", name) 67 } 68 69 func getErrStatus(err error, def string) string { 70 status := def 71 72 if exiterr, ok := err.(*exec.ExitError); ok { 73 if statusObj, ok := exiterr.Sys().(syscall.WaitStatus); ok { 74 status = strconv.Itoa(statusObj.ExitStatus()) 75 } 76 } 77 78 return status 79 } 80 81 func nashdAutoDiscover() string { 82 path, err := os.Readlink("/proc/self/exe") 83 84 if err != nil { 85 path = os.Args[0] 86 87 if _, err := os.Stat(path); err != nil { 88 return "" 89 } 90 } 91 92 return path 93 }