mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
exec.LookPath() unix/windows separation
R=brainman, rsc, vcc, rsc1 CC=golang-dev https://golang.org/cl/2068041
This commit is contained in:
parent
e181bf6e2f
commit
b155a76a40
5 changed files with 153 additions and 44 deletions
|
|
@ -7,7 +7,6 @@ package exec
|
|||
|
||||
import (
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Arguments to Run.
|
||||
|
|
@ -182,40 +181,3 @@ func (p *Cmd) Close() os.Error {
|
|||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func canExec(file string) bool {
|
||||
d, err := os.Stat(file)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return d.IsRegular() && d.Permission()&0111 != 0
|
||||
}
|
||||
|
||||
// LookPath searches for an executable binary named file
|
||||
// in the directories named by the PATH environment variable.
|
||||
// If file contains a slash, it is tried directly and the PATH is not consulted.
|
||||
//
|
||||
// TODO(rsc): Does LookPath belong in os instead?
|
||||
func LookPath(file string) (string, os.Error) {
|
||||
// NOTE(rsc): I wish we could use the Plan 9 behavior here
|
||||
// (only bypass the path if file begins with / or ./ or ../)
|
||||
// but that would not match all the Unix shells.
|
||||
|
||||
if strings.Index(file, "/") >= 0 {
|
||||
if canExec(file) {
|
||||
return file, nil
|
||||
}
|
||||
return "", os.ENOENT
|
||||
}
|
||||
pathenv := os.Getenv("PATH")
|
||||
for _, dir := range strings.Split(pathenv, ":", -1) {
|
||||
if dir == "" {
|
||||
// Unix shell semantics: path element "" means "."
|
||||
dir = "."
|
||||
}
|
||||
if canExec(dir + "/" + file) {
|
||||
return dir + "/" + file, nil
|
||||
}
|
||||
}
|
||||
return "", os.ENOENT
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue