码迷,mamicode.com
首页 > 其他好文 > 详细

golang executable file not found in $PATH

时间:2015-09-17 13:43:12      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

最近使用docker,遇见executable file not found in $PATH,深究一下源码,追溯到golang内置包,看代码

//寻找可执行的文件,取文件的mode(二进制形式)
func findExecutable(file string) error {
	d, err := os.Stat(file)
	if err != nil {
		return err
	}
	//看属性
	if m := d.Mode(); !m.IsDir() && m&0111 != 0 {
		return nil
	}
	return os.ErrPermission
}

来看看linux手册上面的mode数值

S_IFMT      0170000     文件类型的位遮罩  
S_IFSOCK    0140000     socket  
S_IFLNK     0120000     符号链接(symbolic link)  
S_IFREG     0100000     一般文件  
S_IFBLK     0060000     区块装置(block device)  
S_IFDIR     0040000     目录  
S_IFCHR     0020000     字符装置(character device)  
S_IFIFO     0010000     先进先出(fifo)  
S_ISUID     0004000     文件的(set user-id on execution)位  
S_ISGID     0002000     文件的(set group-id on execution)位  
S_ISVTX     0001000     文件的sticky位  
S_IRWXU     00700       文件所有者的遮罩值(即所有权限值)  
S_IRUSR     00400       文件所有者具可读取权限  
S_IWUSR     00200       文件所有者具可写入权限  
S_IXUSR     00100       文件所有者具可执行权限  
S_IRWXG     00070       用户组的遮罩值(即所有权限值)  
S_IRGRP     00040       用户组具可读取权限  
S_IWGRP     00020       用户组具可写入权限  
S_IXGRP     00010       用户组具可执行权限  
S_IRWXO     00007       其他用户的遮罩值(即所有权限值)  
S_IROTH     00004       其他用户具可读取权限  
S_IWOTH     00002       其他用户具可写入权限  
S_IXOTH     00001       其他用户具可执行权限

再看看golang寻找可执行文件

var ErrNotFound = errors.New("executable file not found in $PATH")

func LookPath(file string) (string, 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.Contains(file, "/") {
		err := findExecutable(file)
		if err == nil {
			return file, nil
		}
		return "", &Error{file, err}
	}
	pathenv := os.Getenv("PATH") 
	if pathenv == "" {
		return "", &Error{file, ErrNotFound}
	}
	//遍历环境变量里面所有的路劲,然后寻找path
	for _, dir := range strings.Split(pathenv, ":") {
		if dir == "" {
			// Unix shell semantics: path element "" means "."
			dir = "."
		}
		path := dir + "/" + file
		if err := findExecutable(path); err == nil {
			return path, nil
		}
	}
	return "", &Error{file, ErrNotFound}
}

如果是docker,并且配置在/usr/bin/docker则输入docker会返回具体的执行path:/usr/bin/docker

golang executable file not found in $PATH

标签:

原文地址:http://my.oschina.net/yang1992/blog/507480

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!