golang - 简单实现linux上的which命令

本文提供了在环境变量$PATH设置的目录里查找符合条件的文件的方法。

实现函数

go 复制代码
import (
	"fmt"
	"os"
	"path"
	"strings"
)


// 实现 unix whtich 命令功能
func Which(cmd string) (filepath string, err error) {
	// 获得当前PATH环境变量
	envPath := os.Getenv("PATH")
	// 分割为多个路径
	path_list := strings.Split(envPath, ":")
	for _, dirpath := range path_list {
		// 判断环境变量路径是否是目录
		dirInfo, err := os.Stat(dirpath)
		if err != nil {
			return "", err
		}
		if !dirInfo.IsDir() {
			continue
		}
		// 判断命令所在的路径是否存在
		filepath := path.Join(dirpath, cmd)
		_, err = os.Stat(filepath)
		if err == nil || os.IsExist(err) {
			return filepath, nil
		}
	}
	return "", err
}

单元测试

go 复制代码
import (
	"testing"
    
	"github.com/stretchr/testify/assert"
)

func TestWhich(t *testing.T) {
	filepath, _ := Which("sh")
	assert.Equal(t, filepath, "/bin/sh")

	filepath, err := Which("xxx")
	assert.Equal(t, filepath, "")
	assert.ErrorContains(t, err, "no such file or directory")
}
相关推荐
程序员爱钓鱼2 分钟前
匿名函数与闭包(Anonymous Functions and Closures)-《Go语言实战指南》原创
后端·golang
言之。1 小时前
Go 语言中接口类型转换为具体类型
开发语言·后端·golang
{⌐■_■}2 小时前
【gRPC】HTTP/2协议,HTTP/1.x中线头阻塞问题由来,及HTTP/2中的解决方案,RPC、Protobuf、HTTP/2 的关系及核心知识点汇总
网络·网络协议·计算机网络·http·rpc·golang
运维-大白同学5 小时前
go-中间件的使用
中间件·golang·xcode
{⌐■_■}15 小时前
【go】binary包,大小端理解,read,write使用,自实现TCP封包拆包案例
arm开发·tcp/ip·golang
小G同学17 小时前
golang+gin实现api接口开发
golang·gin
nlog3n17 小时前
Go语言交替打印问题及多种实现方法
开发语言·算法·golang
kaixin_learn_qt_ing17 小时前
Golang
开发语言·后端·golang
Clown9518 小时前
Go语言爬虫系列教程 实战项目JS逆向实现CSDN文章导出教程
javascript·爬虫·golang
Clown9519 小时前
go-zero(十九)使用Prometheus监控ES指标
elasticsearch·golang·prometheus