github.com/ccccaoqing/test@v0.0.0-20220510085219-3985d23445c0/src/os/exec/lp_plan9.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package exec 6 7 import ( 8 "errors" 9 "os" 10 "strings" 11 ) 12 13 // ErrNotFound is the error resulting if a path search failed to find an executable file. 14 var ErrNotFound = errors.New("executable file not found in $path") 15 16 func findExecutable(file string) error { 17 d, err := os.Stat(file) 18 if err != nil { 19 return err 20 } 21 if m := d.Mode(); !m.IsDir() && m&0111 != 0 { 22 return nil 23 } 24 return os.ErrPermission 25 } 26 27 // LookPath searches for an executable binary named file 28 // in the directories named by the path environment variable. 29 // If file begins with "/", "#", "./", or "../", it is tried 30 // directly and the path is not consulted. 31 // The result may be an absolute path or a path relative to the current directory. 32 func LookPath(file string) (string, error) { 33 // skip the path lookup for these prefixes 34 skip := []string{"/", "#", "./", "../"} 35 36 for _, p := range skip { 37 if strings.HasPrefix(file, p) { 38 err := findExecutable(file) 39 if err == nil { 40 return file, nil 41 } 42 return "", &Error{file, err} 43 } 44 } 45 46 path := os.Getenv("path") 47 for _, dir := range strings.Split(path, "\000") { 48 if err := findExecutable(dir + "/" + file); err == nil { 49 return dir + "/" + file, nil 50 } 51 } 52 return "", &Error{file, ErrNotFound} 53 }