github.com/NeowayLabs/nash@v0.2.2-0.20200127205349-a227041ffd50/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  }