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")
}
相关推荐
参.商.1 天前
【Day48】46. 全排列
leetcode·golang
童话ing2 天前
【LeetCode】239.滑动窗口最大值
数据结构·算法·leetcode·golang
不会写DN2 天前
Go 中最主流 JWT 库 jwt -go
开发语言·后端·golang
liuqun03192 天前
go进阶之gc
开发语言·后端·golang
古城小栈2 天前
go核武器——pprof 性能分析
golang
zhuhezhang2 天前
一个用golang开发的文本对比工具
开发语言·后端·golang·wails
Reisentyan2 天前
[backend]GoLang Learn Data Day 2
开发语言·后端·golang
Tony Bai2 天前
Rust 看了流泪,AI 看了沉默:扒开 Go 泛型最让你抓狂的“残疾”类型推断
开发语言·人工智能·后端·golang·rust
ん贤2 天前
AI 大模型落地系列|Eino 编排进阶篇:一文讲透编排(Chain 与 Graph)
人工智能·golang·编排·eino
GDAL3 天前
BoltDB vs SQLite:极简高并发、低配置场景下的终极对比
golang·sqlite·boltdb