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")
}
相关推荐
ezreal_pan5 小时前
巧用 Golang 函数特性实现单元测试中的数据库操作 Mock
开发语言·后端·golang·单元测试·函数
g66x5 小时前
Go语言自学笔记(2.3-2.6)
笔记·golang
随风ada8 小时前
Windows、macOS、liunx下使用qemu搭建riscv64/linux
linux·windows·ubuntu·macos·golang·qemu·risc-v
神器阿龙11 小时前
Go语言高并发聊天室(三):性能优化与压力测试
性能优化·golang·压力测试
ん贤1 天前
如何加快golang编译速度
后端·golang·go
riverz12271 天前
Go 程序无法使用 /etc/resolv.conf 的 DNS 配置排查记录
golang
As_wind_1 天前
Go 语言学习之测试
开发语言·学习·golang
linweidong2 天前
Go语言时间控制:定时器技术详细指南
后端·golang·go定时器·go开发·go面试·go分布式·go timer
一条闲鱼_mytube3 天前
gin go-kratos go-zero框架对比
开发语言·golang·gin
come112343 天前
Go 包管理工具详解:安装与使用指南
开发语言·后端·golang